python 爬虫笔记 一

最近看一些公开课,看完自己动手写一遍,一天进步一点。
有些地方还是要做下笔记,方便以后遇到查看
**########################################################


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]
这个是唯一的
这里写图片描述

通过BeautifulSoup获取到的是一个列表,遍历出来后发现是 bs4.element.Tag 这种类型 所以直接 url[‘src’],就能获取想要的图片连接,这个主要还是对bs4不过基础不够熟悉,所以遇到问题还是要多百度多想!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值