设为首页 收藏本站
查看: 1826|回复: 0

[经验分享] 基于python的scrapy爬虫抓取京东商品信息

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2016-12-14 09:10:59 | 显示全部楼层 |阅读模式
这是上的第二节爬虫课程的课后作业:抓取京东某类商品的信息,这里我选择了手机品类。

使用scrapy爬虫框架,需要编写和设置的文件主要有phone.py , pipelines.py , items.py , settings.py , 其中主要编写的是前两个文件,最后一个文件主要设置破解反爬方法。

phone.py编写程序如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
import scrapy
from scrapy.http import Request
from jd_phone.items import JdPhoneItem
import re
import urllib.request

class PhoneSpider(scrapy.Spider):
    name = "phone"
    allowed_domains = ["jd.com"]
    start_urls = ['http://jd.com/']

    #获取商品手机100页网址
    def parse(self, response):
        for i in range(1, 100):
            url = "https://search.jd.com/Search?keyword=手机&enc=utf-8&page="+str(i*2-1)
            yield Request(url=url,callback=self.product_url)

    #获取每页商品链接
    def product_url(self, response):
        urls = response.xpath('//div[@class="p-name p-name-type-2"]/a[@target="_blank"]/@href').extract()
        for i in urls:
            url = response.urljoin(i)
            yield Request(url=url, callback=self.product)

    #获取商品的链接,名称,价格,评论数
    def product(self, response):
        #获取标题
        #title = response.xpath("//li[@class='img-hover']/img/@alt").extract()#部分网页不行
        title = response.xpath("//img/@alt").extract()
        #获取id号,用来构造价格和评论的链接
        pattern = r"(\d+)\.html$"
        id = re.findall(pattern, response.url)
        #得到价格
        priceUrl = "https://p.3.cn/prices/mgets?&skuIds=J_"+str(id[0])
        priceData = urllib.request.urlopen(priceUrl).read().decode("utf-8", "ignore")
        patt = r'"p":"(\d+\.\d+)"'
        price = re.findall(patt, priceData)
        #得到评论数
        commentUrl = "https://club.jd.com/comment/productCommentSummaries.action?referenceIds="+str(id[0])
        commentData = urllib.request.urlopen(commentUrl).read().decode("utf-8", "ignore")
        patt1 = r'"CommentCount":(\d+),'
        comment = re.findall(patt1, commentData)

        item = JdPhoneItem()
        item["url"] = response.url
        item["title"] = title[0]
        item["price"] = price[0]
        item["comment"] = comment[0]
        yield item





pipelines.py编写程序如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import pymysql.cursors

class JdPhonePipeline(object):
    #连接登陆mysql,新建数据表
    def __init__(self):
        self.conn=pymysql.connect(host="127.0.0.1",
                                  user="root",
                                  passwd="123456",
                                  charset='utf8mb4',
                                  cursorclass=pymysql.cursors.DictCursor)
        cur = self.conn.cursor()
        cur.execute("CREATE DATABASE jd")
        cur.execute("USE jd")
        cur.execute("CREATE TABLE phone (id INT PRIMARY KEY AUTO_INCREMENT,url VARCHAR(50),title VARCHAR(50),price VARCHAR(10),comment VARCHAR(10))")

    #mysql写入
    def process_item(self, item, spider):
        try:
            url = item["url"]
            title = item["title"]
            price = item["price"]
            comment = item["comment"]
            cur = self.conn.cursor()
            sql = "INSERT INTO phone (url, title, price, comment) VALUES ('"+url+"','"+title+"','"+price+"','"+comment+"')"
            cur.execute(sql)
            self.conn.commit()
            return item
        except Exception as err:
            print(err)

    #关闭连接
    def close_spider(self):
        self.conn.close()



items.py编写程序如下:
1
2
3
4
5
6
7
8
9
10
import scrapy


class JdPhoneItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    url = scrapy.Field()
    title = scrapy.Field()
    price = scrapy.Field()
    comment = scrapy.Field()



另外不忘settings.py设置常规破解反爬方法。

这个爬虫项目主要学习了:
  • 网页源代码屏蔽数据的获取,使用F12开发人员调试工具获取屏蔽信息的网址,通过下载网址读取数据匹配所需信息。

  • 将抓取的数据写入mysql中。
    要将mysql数据写进本地csv文件,使用如下方法
    mysql> select * from phone
       --> into outfile'c:/ProgramData/MySQL/MySQL Server 5.7/Uploads/phone.csv'
       --> fields terminated by ',' optionally
       --> enclosed by '"' escaped by '"'
       --> lines terminated by '\n';
    解决导出csv中文乱码的问题,将phone.csv复制到桌面,用记事本打开,然后另存为,选择utf8编码。

    如果是要将csv数据写进mysql,使用如下方法(先要创建对应数据表)
    mysql> load data infile 'c:/ProgramData/MySQL/MySQL Server 5.7/Uploads/phone.csv'
       --> into table phone1
       --> fields terminated by ','  optionally
       --> enclosed by '"' escaped by '"'
       --> lines terminated by '\n';




运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-314046-1-1.html 上篇帖子: PYTHON 多线程信号量 下篇帖子: python分析nginx日志 python 京东 信息
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表