这段时间,因为疫情在家无聊,想起了网络爬虫,之前有写过使用requests库,又学了下使用urllib库,在这里记录下学习过程。
首先使用的IDE是pycharm,解释器版本3.
第一步:分析某东的url,发现某东搜索的url构成规律,输入汉服后开始搜索。
点击下一页后,保存相对应的url
发现每一页的url不同之处在于其中的&page=数字那里,从第二页开始,page= 后面的数字以2递增,为一个等差数列。改写page=0,在浏览器中打开后发现是第一页,所以所有的url可以构造为一个列表。
第二部,分析html,查找每一个商品图片对应的url
检查两三个图片的html元素
发现图片url是这样子的,方便好设计正则表达式,因为html中有很多url不是商品图片链接,所以有必要多看几个,当然,大佬就肯定不必了(我是新手哈哈哈))
正则表达式:
pat = re.compile(r'//.{5}\.360buyimg.com/n8/.*\.jpg')
然后就是一次次打开图片url后保存了
附代码:
#-*- coding:utf-8 -*-
"""
@Date: 2020/2/11 20:38
@Author:Shihan Wong
@File: 某东商品图片爬取.py
@Software: PyCharm
"""
import urllib.request
import UA_Pool # 自定义的用户代理池
import requests , re
import IP_Pools # 自定义的IP池
import os
this_ua = UA_Pool.get_UA()
headers = ("user-agent" , this_ua)
kw = urllib.request.quote('汉服') # 关键字
page_num = int(input("请输入要爬取的页数:")) #获取爬取页数
urls = ["https://search.jd.com/Search?keyword=%E6%B1%89%E6%9C%8D&enc=utf-8&qrst=1&rt=1&stop=1&vt=2&wq=%E6%B1%89%E6%9C%8D&page= "
+ str(2 * i -1) + "&s=213&click=0" for i in range(1 , page_num + 1)] # 构造页面url列表
"""
this_ip = IP_Pools.get_ip()
pro = urllib.request.ProxyHandler({"http":this_ip})
opener = urllib.request.build_opener(pro , urllib.request.HTTPHandler)
opener.addheaders = [headers]
urllib.request.install_opener(opener)
# res = urllib.request.urlopen(url).read().decode("UTF-8" , "ignore")
"""
this_agent = UA_Pool.get_UA() # 调用get_UA函数获取UA
header = {
"user-agent":this_agent
} # 构造报头
flag = 1 # 页数标识,从第一页开始
for url in urls: #遍历页面url列表
path = "E:\\Desktop\\" + str(flag) + "页"
if os.path.exists(path) == False:
os.mkdir(path)
try:
res = requests.get(url, headers=header) # requests.get请求
res.encoding = res.apparent_encoding # 转换编码
html = res.text # 返回html文件
pat = re.compile(r'//.{5}\.360buyimg.com/n8/.*\.jpg') #定义正则表达式
links = pat.findall(html) # 匹配图片的url链接
for link in links: #遍历字ulr列表
url_sub = 'http:' + link # 构造url链接,需要在前面添加http:
res_sub = requests.get(url_sub) # 再次请求
post_name = link.split("/")[-1] # 以/分割每一个url,用最后一个定义为该url所对应的图片文件名称
save_path = path + "\\" + post_name # 再次设计保存路径
with open(save_path, 'wb') as f: # 将图片爬取保存,以二进制方式
f.write(res_sub.content)
flag += 1 # 保存后页数标识加一
except Exception as e:
print(e) # 提示错误
代码中flag的作用就是记录一下爬取的页数,然后好方便创建相对应的文件夹
哈哈哈本来是想用urllib的,但莫名其妙出现错误,但requests却可以,显示好像编码啥的有问题。