[简单的python爬虫实战] ,查询亚马逊产品的关键词排名 [日本站]

今天回顾了一下定向爬虫的编写,想起以前的工作需求,有感而发写了一个简单的爬虫

爬虫功能:

这个爬虫脚本是根据之前在做亚马逊销售的时候的工作需要,从而编写的代码。用以检查产品的关键词排名,从而判断是否需要刷单和找出表现不佳的关键词。通过改变soup的选择器还可以获取到页面中产品的售价,Asin等信息。

爬虫基础:

先通过requests获取 url ,然后请求 url ,获得 url响应的网页信息。
在通过 beautifulsoup 解析响应页面,提取需要的数据,进行二次请求或者是信息的保存。
信息的保存上,利用csv进行保存,方便用excel进行数据的分析。
import urllib.parse as urlparse
import requests
from bs4 import BeautifulSoup
import csv

定义url请求的函数,用以获取网站的响应。对应网站的反爬策略,可以考虑添加代理增强爬虫的安全性

def req(url):
    headers = {'User-Agent': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)'} #简单定义个headers,防止识别爬虫
    res = requests.get(url, headers=headers)
    if res.status_code == 200:
        res.encoding="utf-8"
        return res.text
    else:
        print('请求 %s 失败' % (url))
        return 0

定义设置参数:

SITE = r"http://www.amazon.co.jp"
Apartment="aps"
#设置查询的页码数
Pages=3
#设置要查询的关键词
KEYWORDS = [
    "switch",
    "game"
]
#需要查询的产品Asin值
Asin =[
    "B01NCX3W3O",
    "B07BQXJGW5"
]

定义保存文件的函数:

def csvWrite(name='downoad', data=[]):
    with open(name + '.csv', 'a+', newline='') as f:
        csv_file = csv.writer(f, dialect='excel')
        csv_file.writerow(data)

解析函数:

# def kwItem(keyword,page):
  def kwItem():
     for keyword in KEYWORD:
        for page in range(1, Pages + 1):
            #生成搜素结果页面的url
            data = {
                "keywords": keyword,
                "page": page,
                "rh": "i:" + Apartment + ",k:" + keyword
            }
            url = SITE + "/s/ref=nb_sb_noss?" + urlparse.urlencode(data)
            #获得请求的页面源代码,利用 BeautifulSoup 和lxml解释器进行解析        
            response = requestUrl.req(url)
            soup = BeautifulSoup(response, "lxml")
            #提取页面中需要的数据,这里简单地提取了关键词涉及包含的产品数目,还有寻找目标产品是否在搜索范围内,是则返回对应asin关键词的排名
            TotalItem = soup.select("#s-result-count")[0].text
            if page == Pages:
                csvWrite(name='kwItem&AsinRank', data=[keyword, TotalItem])
            for asin in Asin:
                if asin in response:
                    rank = soup.find_all(attrs={"data-asin": asin})[0].attrs["data-result-rank"]
                    csvWrite(name='kwItem&AsinRank', data=[keyword, TotalItem, asin, rank])

添加多进程:

from multiprocessing import Pool

利用进程池加快程序运行的效率,这里用到的模块是multiprocessing 。

def main():
    print('Start process.')
    p = Pool(4)
    for i in KEYWORDS:
        for page in range(1, Pages + 1):     
#开启多线程时,关键词 和 页码 作为参数进行传递,需要把解析函数中控制函数运行的循环语句给去掉
            p.apply_async(kwItem,(i,page,))
    print('Waiting for all subprocesses done...')
    p.close()
    p.join()

最后别忘了让程序可以运行~

if __name__ == '__main__':
    main()


猜你喜欢

转载自blog.csdn.net/m_c_ing/article/details/80543976
今日推荐