最近看一些公开课,看完自己动手写一遍,一天进步一点。
有些地方还是要做下笔记,方便以后遇到查看
**########################################################
import requests
import urllib
search_words=input('请输入要搜索的内容:')
pages= int(input('请输入要搜索的页数:'))
word = urllib.parse.quote(search_words)
#print (word)
for m in range(0,pages):
first_url = "https://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj&ct=201326592&is=&fp=result&queryWord="+word+"&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=-1&z=&ic=0&word="+word+"&s=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1&fr=&cg=girl&pn="+str(m*30)+"&rn=30&gsm=d2&1519539512504="
url_respon = requests.get(first_url)
for num in range(0,30):
last_url=url_respon.json()['data'][num]['middleURL']
# print(last_url,last_url[-20:])
picture = requests.get(last_url).content
with open('D:/python3//123//'+last_url[-20:],"wb") as f:
f.write(picture)
上面代码是百度图片爬虫。
几个知识点:
1 网页源代码 找不到响应的图片链接
2 通过F12-网络— 可以看到
分析发现没规律
3 往下拉发现这样一条链接
所以思路就是 获取json数据,提取图片链接
4 `
with open('D:/python3//123//'+last_url[-20:],"wb") as f:
f.write(picture)
注意路径的//连个斜杠
5
last_url=url_respon.json()['data'][num]['middleURL']
json获取方式
6
代码的功能是可以让用户自己输入要搜索的内容。输入的是中文,但是在url里面是编码后的格式。所以可以使用
urllib.parse.quote()
对输入的字符编码(这个没有通读过urllib,之前不知道)
search_words=input('请输入要搜索的内容:')
pages= int(input('请输入要搜索的页数:'))
word = urllib.parse.quote(search_words)
#
下面是某个不可描述的网站的图片爬虫
import re
import urllib.request
import requests
url = 'http://xxxxxxxxxxx.html'
headers = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Cache-Control': 'max-age=0',
'Connection': 'keep-alive',
'Cookie': '__cfduid=d597defc0b1a039e66131642a9a488f231519565363',
'Host': 'xxxxxxxx',
'If-Modified-Since': 'Sat, 17 Feb 2018 15:52:01 GMT',
'If-None-Match': "5a884fa1-b2068",
'Upgrade-Insecure-Requests': '1',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36'
}
num=0
pic_html_response = requests.get(url).text
reg = re.compile('http://xxxxx.com.*?jpg')
re_url = re.findall(reg,pic_html_response)
#print (pic_html)
#pic = pic_html.select('p:nth-of-type(6)')[0]
for n in re_url:
re_lib = urllib.request.Request(url=n,headers=headers)
req1 = urllib.request.urlopen(re_lib).read()
print (req1)
with open('D:\\python3\\123\\%s.jpg' % num,'wb') as f:
f.write(req1)
num=num+1
几个知识点:
1 网页源代码可以看到图片链接。但是直接通过selector 去选取,到最后要获取剩余的连接是,发现要用正则去匹配,结果想想,那还是不如直接用正则去匹配整个源码。所以就没有使用bs4了
2 正则匹配的一个小TIPS
可以把网页源码复制在 notepad++里面,一个正则搜索功能。直接在上面测试匹配情况,然后再带入代码,方便了很多
3
正则代码
reg = re.compile('http://xxxxx.com.*?jpg')
re_url = re.findall(reg,pic_html_response)
4
因为获取到的是链接,而我想要保存的图片。
所以百度看看
本来打算用urllib.urlretrieve(url, filename=None, reporthook=None, data=None)
结果程序运行出错,请求显示403
后面发现是请求的时候是直接去请求图片地址,有些网站有做限制
所以要带上headers才行
最后选择用这种方式
for n in re_url:
re_lib = urllib.request.Request(url=n,headers=headers)
req1 = urllib.request.urlopen(re_lib).read()
print (req1)
with open('D:\\python3\\123\\%s.jpg' % num,'wb') as f:
f.write(req1)
num=num+1
5
注意这个模块的导入
import urllib.request
代码还有很多问题,比如图片写入本地的时候很慢。
限制的能力只能先实现功能,后续有能力了在慢慢去做代码优化
++++++++++++++++++++++++++++++++++++++++++++++++++++++=
20180227
接上部分怕某不可描述的网站
上面通过正则爬,放弃用bs4 ,但是因为分析的是单页,结果发现其他页的图片链接地址变了。。。变了。。。变了。。。 两个html页面对比发现,他们的结构是一样 所有只能又用回bs4 下面是代码
pic_html_response = requests.get(first_url).text
soup_url = BeautifulSoup(pic_html_response,'lxml')
urls = soup_url.select(' input[type="image"]')
for url in urls[1:]:
pic_url = url['src']
看了好久才发现
input[type=”image]
这个是唯一的