今天回顾了一下定向爬虫的编写,想起以前的工作需求,有感而发写了一个简单的爬虫
爬虫功能:
这个爬虫脚本是根据之前在做亚马逊销售的时候的工作需要,从而编写的代码。用以检查产品的关键词排名,从而判断是否需要刷单和找出表现不佳的关键词。通过改变soup的选择器还可以获取到页面中产品的售价,Asin等信息。
爬虫基础:
先通过requests获取 url ,然后请求 url ,获得 url响应的网页信息。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()