帮助中心

   

热门搜索: 免费续期  推广  永久会员

代理IP详解京东商品爬取案例(2)

在上一篇文章我们已经把整个要做的爬虫项目框架进行的梳理,接下来就是爬取的实战环节了,下面来一起看看成果吧。

代码部分:

# -*- coding: utf-8 -*-

#导入库i

mport scrapy

import urllib.request

import re

from jingdong.items

import JingdongItem

from scrapy.linkextractors

import LinkExtractor

from scrapy.spiders

import CrawlSpider, Rule

from scrapy.http

import Request

import pymysql

from fake_useragent

import UserAgent

from jingdong.middlewares

import JingdongSpiderMiddlewareProxyIPclass JdSpider(CrawlSpider):

name = ‘jd’

allowed_domains = [‘jd.com’]

# start_urls = [‘http://jd.com/’]

# ua = UserAgent()

# headers = {‘UserAgent’: ua.random}

header = {

“User-Agent:”: “Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36”}

#第一次爬取的时候就需要模拟成浏览器,所以把前面的start_urls注释掉

def start_requests(self):

print(1)#callback返回的数据要回到parse中处理

return [Request(“http://jd.com/”, callback=self.parse, headers=self.header,

meta={“cookiejar”: 1})]#因为是整站爬取,所以allow为空

rules = ( Rule(LinkExtractor(allow=r”), callback=’parse_item’, follow=True), ) def parse_item(self, response): try: i = JingdongItem()

#i[‘domain_id’] = response.xpath(‘//input[@id=”sid”]/@value’).extract()

#i[‘name’] = response.xpath(‘//div[@id=”name”]’).extract()

#i[‘description’] = response.xpath(‘//div[@id=”description”]’).extract() thisurl=response.url

pat=”https://item.jd.com/(.*?).html”

x=re.search(pat,thisurl)

if (x): thisid=re.compile(pat).findall(thisurl)[0]

print(thisid)

#这里用xpath表达式提取 信息

shop_title=response.xpath(“/html/head/title/text()”).extract() shop_name=response.xpath(“//div[@class=’name’]/a/@title”).extract() shop_link=response.xpath(“//div[@class=’name’]/a/@href”).extract()

# print(shop_title) # print(shop_name)

# print(shop_link) # print(“————-“) moneyurl=”https://p.3.cn/prices/mgets?callback=jQuery3964279&type=1&area=1_72_2799_0&pdtk=&pduid=8240587&pdpin=%25E5%25BF%25A0%25E8%25BF%2585%25E8%25BF%2585%25E8%25BF%2585&pin=%E5%BF%A0%E8%BF%85%E8%BF%85%E8%BF%85&pdbp=0&skuIds=J_”+str(thisid)+”%2CJ_6476164%2CJ_29497744325%2CJ_5054737%2CJ_3437798%2CJ_30082909321%2CJ_3399949%2CJ_3136674%2CJ_3639091%2CJ_5164921&ext=11100000&source=item-pc” commenturl=”https://sclub.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98vv5691&productId=”+str(thisid)+”&score=0&sortType=5&page=1&pageSize=10&isShadowSku=0&rid=0&fold=1″

# print(moneyurl)

# print(commenturl)

moneydata=urllib.request.urlopen(moneyurl).read().decode(“utf-8″,”ignore”)

commentdata=urllib.request.urlopen(commenturl).read().decode(“utf-8″,”ignore”)

#这里用正则表达式来提取抓包分析得到的数据

moneypat='”p”:”(.*?)”‘

commentpat1='”goodRateShow”:(.*?),’

commentpat2='”commentCount”:(.*?),’

shop_money=re.compile(moneypat).findall(moneydata)

shop_comment1=re.compile(commentpat1).findall(commentdata) shop_comment2=re.compile(commentpat2).findall(commentdata)

if (len(shop_title)

and len(shop_name)

and(len(shop_link)

and len(shop_money)

and len(shop_comment1)

and len(shop_comment2))):

print(shop_name[0])

print(shop_title[0])

print(shop_money[0])

print(shop_comment1[0])

print(shop_comment2[0])

print(shop_link[0])

print(“———-“)

print()

conn = pymysql.connect(host=’localhost’, user=’root’, passwd=’123456′, port=3306, db=’jingdong’,charset=’utf8′)

cur=conn.cursor()

sql = “insert into jd(shop_name,shop_title,money,comment1,comment2,shop_link) values(‘” + shop_name[0]+”‘, ‘”+shop_title[0]+”‘, ‘”+shop_money[0]+”‘, ‘”+shop_comment1[0]+”‘, ‘”+shop_comment2[0]+”‘, ‘”+shop_link[0]+”‘)” cur.execute(query=sql) conn.commit()

# conn.query(sql)

cur.close()

conn.close()

else:

pass

else:

pass

return i

except Exception as e:

print(e)

简单思路:

(1)明确我们需要提取的信息

(2)分析网站,找出哪些信息是需要抓包分析的

(3)找出商品 url 的规律

(4)查看源码,通过表达式提取信息

(5)编写往数据库中插入所需的信息

(6)设置中间文件

(7)开启爬虫

中间文件设置:

class JingdongSpiderMiddlewareProxyIP(object): def __init__(self): self.conn = pymysql.connect(host=’localhost’, user=’root’, passwd=’123456′, port=3306, db=’ip’, charset=’utf8′) self.cursor = self.conn.cursor() ProxyIP = self.cursor.execute(“select * from myip2”) self.IPPOOL = [] for row in self.cursor.fetchall(): ipinfo = {}#取出数据库中的第一列和第二列,组成一个字典的形式 ipinfo[‘ipaddr’] = str(row[0]) + ‘:’ + str(row[1]) self.IPPOOL.append(ipinfo) def process_request(self, request, spider): thisip=random.choice(self.IPPOOL) print(“当前ip是:”+thisip[“ipaddr”]) try: request.meta[“proxy”]=”http://”+thisip[“ipaddr”] except Exception as e: print(e) pass

settings 设置:

代理IP详解京东商品爬取案例

代理IP详解京东商品爬取案例

到这里整个程序就已经结束了。

说明一下:这里是爬取京东整站,所以会访问比较频繁,所以我们需要用前面爬取到的代理 ip 来爬取,每爬取一次就换一个 ip ,这样就不会被识别出来。

下面让我们启动爬虫:

Nolog:不显示日志信息,如果程序报错就要看日志信息来排错了。

Scrapy crawl jd – -nolog 启动命令

代理IP详解京东商品爬取案例

代理IP详解京东商品爬取案例

可以看到尽管爬取下来的 ip 是经过测试的,但是有些 ip 还是不能用,免费的和付费的差别就差在稳定性。一般在工司做都会有代理 ip 池提供。

来看下爬取到的信息存入数据库中:

代理IP详解京东商品爬取案例

可以看到数据库中的数据是抓取成功的了,京东商城的商品很多,要爬完需要有一定的时间。有兴趣的也可以设置多进程。

那么到这里我们这个案例爬虫分享就告一段落了,不知道通过这个案例的分享大家有没有学习到关于爬虫的一些操作技巧呢?

关闭
19907977089
关注微信公众号,免费送30分钟时长