其他
爬虫分享——某逊爬虫案例
这次给大家分享点不一样的内容,这次内容比较偏技术型,有兴趣的朋友可以看看,没兴趣的朋友,也可以赏个脸看看。关于某逊相信大家也听过,应该也上过它的网站去买东西,对于这个平台其实还是有很多数据可以挖挖的,至于挖完之后可以干嘛?dddd!这里就不多说了,花了几天的零碎时间整理了一下该网站的爬虫,现在就一次性发出来给大家吧!(文章末尾附上爬虫效果)
首先介绍一下这次爬虫的工具,这次爬虫主要用到了以下三块内容:
Mitmproxy:这个其实不用也可以,也可以用google网页自带的检查器
Scrapy:一个Python的爬虫框架,非常好用
IP代理池:这一块用了Github某位大佬搭建的Ip代理池,虽然免费,但是效果确实一般般,建议有条件的可以自已搭建一个哈~)
Mysql:建立一个表用于存放数据等
scrapy目录如下:
接着我主要展示比较核心的py文件,amazon_level1以及middlerwares.py这两个文件
# amazon_level1.py
import scrapy
import redis
import json
from lxml import etree
from urllib.parse import urlencode
from amazon_crawl.items import AmazonCrawlItem
class AmazonLevel1Spider(scrapy.Spider):
name = 'amazon_level1'
start_urls = ['https://www.amazon.cn/s?']
headers = {
'Host': 'www.amazon.cn',
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36',
'Sec-Fetch-Site': 'none'
}
def __init__(self, page_nums=2, keyword='笔记本电脑', *args, **kwargs):
super().__init__(*args, **kwargs)
self.page_nums = page_nums
self.keyword = keyword
def start_requests(self):
for page in range(self.page_nums):
data = {
'k': self.keyword,
'page': str(page),
'__mk_zh_CN': '亚马逊网站',
}
url_1 = self.start_urls[0] + urlencode(data)
yield scrapy.FormRequest(url=url_1, headers=self.headers, callback=self.parse_url_one, dont_filter=True)
def parse_url_one(self, response):
# response.text = 'utf-8'
html = etree.HTML(response.text)
root_ = html.xpath('//*[@id="search"]/div[1]/div[1]/div/span[3]/div[2]/div')
if root_:
for i in root_:
try:
url = 'https://www.amazon.cn/' + i.xpath('./div/div/div/div/div[2]/div[1]/h2/a/@href')[0]
title = i.xpath('./div/div/div/div/div[2]/div[1]/h2/a/span/text()')[0]
stars = i.xpath('./div/div/div/div/div[2]/div[2]/div/span[1]/span/a/i[1]/span/text()')[0]
stars_counts = i.xpath('./div/div/div/div/div[2]/div[2]/div/span[2]/a/span/text()')[0]
price = i.xpath('./div/div/div/div/div[2]/div[3]/div[1]/a/span[1]/span[1]/text()')[0]
dict_info = {'url': url, 'title': title, 'stars': stars,
'stars_counts': stars_counts, 'price': price}
yield scrapy.FormRequest(url=url, headers=self.headers, callback=self.parse_url_two, dont_filter=True, meta={'info': dict_info})
except:
continue
def parse_url_two(self, response):
# response.text = 'utf-8'
dict_info = response.meta['info']
html = etree.HTML(response.text)
item = AmazonCrawlItem()
try:
comment = html.xpath('//*[@id="acrCustomerReviewText"]/text()')[0]
except:
comment = None
item['url'] = dict_info['url']
item['title'] = dict_info['title']
item['stars'] = dict_info['stars']
item['price'] = dict_info['price']
item['stars_num'] = dict_info['stars_counts']
item['comment'] = comment
item['keyword'] = self.keyword
yield item
# middlerwares.py
"""
这一块主要是调用ip代理的
"""
class MyproxyPoolMiddleware:
def __init__(self, ip=''):
self.ip = ip
def get_proxy(self):
return requests.get("http://127.0.0.1:5010/get/").json()
def delete_proxy(self, proxy):
requests.get("http://127.0.0.1:5010/delete/?proxy={}".format(proxy))
def process_request(self, request, spider):
# ....
proxy = self.get_proxy().get("proxy")
# 删除代理池中代理
self.delete_proxy(proxy)
# 使用代理访问
request.meta["proxy"] = "http://{}".format(proxy)
最后总结一下,关于这次的内容还是有几个不足之处:
1、Ip代理池这一块效果并不理想(免费的确实不太好用,有条件建议搞个Ip隧道啥的,随便用,就是成本高了一点点)
2、关于某逊的数据其实还是有很多数据可以抓取,这里抓的并不全面。
虽然并不是很完美,但是效果还是不错滴..
友情提示:切记勿作商业用途,仅供个人学习使用!有关代码的地方,如有不懂的地方欢迎留言!