作为一个几乎经常要买买买的馆员,每次看到一大堆购物车里的图书,然后要一本本查重,总是觉得很心累啊。今天总算想通了,花点时间弄个自动查重的程序吧,这样也能解放自己了。
原理很简单,主要就是依靠爬虫,先爬取购物车里的图书,只要书名和ISBN两个字段就可以了,然后再通过OPAC查重就可以了。
首先要做的自然是导入库啦
import requests
from bs4 import BeautifulSoup
import time
import re
要爬购物车的图书,自然要先登录才行,这里我小偷懒一下,不弄自动登录那种了,太麻烦了。直接传入cookie就行了。
在浏览器登录账号,按F12进入检查,把cookie信息拷出来,命名为cookie.txt保存本地。
拷贝cookie到本地txt.png
再通过一段代码读取到py文件中。
with open('cookies.txt','r') as file:
cookie = file.read()
这样就可以构建请求头啦。
headers = {
'Accept':'application/json, text/javascript, */*; q=0.01',
'Accept-Encoding':'gzip, deflate, br',
'Accept-Language':'zh-CN,zh;q=0.9',
'User-Agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 \
(KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36',
'Host':'www.amazon.cn',
'Cookie':cookie,
'X-Requested-With':'XMLHttpRequest'
}
下面就可以爬取购物车里的图书了。
先获取购物车里图书链接
直接上代码
def getItemUrl(url):
#从购物车中获取商品的url
items_url = []
r = requests.get(url,headers=headers)
soup = BeautifulSoup(r.text,'lxml')
url_infos = soup.find_all('span',class_="a-size-medium sc-product-title a-text-bold")
for url_info in url_infos:
item_url = 'https://www.amazon.cn' + url_info.parent['href'] #找到父节点的href属性
items_url.append(item_url)
return items_url
获取链接很简单,浏览器按F12,我是findall找到class="a-size-medium sc-product-title a-text-bold"的<span>标签,然后再找<span>的父节点就是我们要爬取的<a>标签了,也可以从上往下一层层爬下来,但是标签嵌套太多,太复杂了。
爬取的url是相对路径,还需要加上亚马逊的域名才成。
有了图书的url接下来就是爬取图书信息了
还是上代码
def getInfo(url):
#获取商品的信息
items_url = getItemUrl(url)
for url in items_url:
time.sleep(2)
r = requests.get(url,headers=headers)
soup = BeautifulSoup(r.text, 'lxml')
#获取书名和isbn
name = soup.find(id="productTitle").get_text() #书名
isbns = re.findall('<li><b>ISBN:</b>(.*?)</li>',r.text,re.S)[0].strip() #isbn
#ISBN号多于2个的,只取13位的那个isbn
if len(isbns) > 13:
isbn_list = isbns.split(',')
for isbn_n in isbn_list:
isbn_n = isbn_n.strip() #删除左右空白
if len(isbn_n) == 13:
isbn = isbn_n
else:
pass
else:
isbn = isbns
书名很容易就能找到,ISBN稍微有点麻烦,有的ISBN13位和10位的同时存在,所以需要把他们分开,然后取用13位的那个。
再来就是查重啦,激动,终于要解放了
代码接上面的,放在getInfo()函数里
#ISBN查重
lib_url = 'http://192.168.1.9:8080/opac/openlink.php?strSearchType=isbn&strText={}'.format(isbn)
r = requests.get(lib_url)
try:
result = re.findall('本馆没有您检索的图书',r.text)
if result:
print('{} - 本馆未检索该图书'.format(name))
else:
result = re.findall('<p style="font-size:14px;">检索到 <strong class="red">(.*?)</strong> 条',r.text)[0]
print('{} - 检索到{}条结果'.format(name, result))
except Exception as e:
print(e)
查重很简单,找两本书,一本馆藏有的,一本馆藏没有,分别搜索看出来的页面是什么样子的,馆藏有的会出来类似这样的“检索到 1 条 ISBN/ISSN=978-7-302-51145-8 的结果”文字,没有检索到的会出现“本馆没有您检索的图书”,所以很好判断,我是通过正则来判断的,很方便。
馆藏有.png 馆藏没有.png
最后展示下成果吧!
查重结果.png
网友评论