查看原文
其他

爬虫分享——某逊爬虫案例

灰熊 Python分析与挖掘 2024-04-03

    这次给大家分享点不一样的内容,这次内容比较偏技术型,有兴趣的朋友可以看看,没兴趣的朋友,也可以赏个脸看看。关于某逊相信大家也听过,应该也上过它的网站去买东西,对于这个平台其实还是有很多数据可以挖挖的,至于挖完之后可以干嘛?dddd!这里就不多说了,花了几天的零碎时间整理了一下该网站的爬虫,现在就一次性发出来给大家吧!(文章末尾附上爬虫效果)

    

首先介绍一下这次爬虫的工具,这次爬虫主要用到了以下三块内容:

  1. Mitmproxy:这个其实不用也可以,也可以用google网页自带的检查器

  2. Scrapy:一个Python的爬虫框架,非常好用

  3. IP代理池这一块用了Github某位大佬搭建的Ip代理池,虽然免费,但是效果确实一般般,建议有条件的可以自已搭建一个哈~)

  4. Mysql:建立一个表用于存放数据等


scrapy目录如下


接着我主要展示比较核心的py文件,amazon_level1以及middlerwares.py这两个文件

# amazon_level1.pyimport scrapyimport redisimport jsonfrom lxml import etreefrom 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、关于某逊的数据其实还是有很多数据可以抓取,这里抓的并不全面。


虽然并不是很完美,但是效果还是不错滴..




友情提示:切记勿作商业用途,仅供个人学习使用!有关代码的地方,如有不懂的地方欢迎留言!

继续滑动看下一个
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存