0%

Python网络爬虫

Python网络爬虫

Urllib

  • urllib.request.urlopen返回一个response
1
resp = urllib.request.urlopen("http://www.baidu.com")
  • urllib.request.urlopen("...").read()返回网页源代码

==但是有一些网页禁止爬虫访问,这个时候就要做浏览器伪装==

1
2
3
4
web = "https://www.bilibili.com/"
header = {'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:71.0) Gecko/20100101 Firefox/71.0'}
resp = urllib.request.Request(url=web, headers=header)
page = urllib.request.urlopen(resp)
  • header用页面审查元素的网络的请求头的原始头里查看

  • 如果url里有中文

  •  web = "https://www.bilibili.com/"
        text = quote("1加1",encoding='GBK')
        baidu = "http://www.baidu.com/s?wd="+text+"&lm=1"
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12

    - `quote`来自`urllib.parse`,能把中文转码
    - 然后`/s?wd=`是百度搜索时要加的东西
    - 后面的`&lm=1`要加(`&lm=0`也行),不然会进入安全认证(我暂时还不知道为什么)

    ## bs4.BeautifulSoup

    - `BeautifulSoup`

    ```python
    soup = BeautifulSoup(resp, features='lxml')
    soup = BeautifulSoup(resp, features='html.parser')

resp就是上面的resp,featrues就是网页的解释器

1
2
3
4
5
6
7
8
9
10
print(soup.title)
print(soup.title.name)
print(soup.title.string)
print(soup.title.parent.name)
print(soup.p)
print(soup.p["class"])
print(soup.a)
print(soup.find_all('a'))
print(soup.find(id='link'))
print(soup.prettify())
  • soup.find('a')会找到tag a第一次出现的地方,然后把这个包装成一个tag对象

  • soup.find_all('a')会找到所有的tag a然后会返回一个可迭代对象,对象中的每一个元素都是一个tag对象

    •     for i in img:
              print(i)
              print(i.get('src'))   #得到src属性的东西
              print(i['src']) #与上面一样
      
      1
      2
      3

      - ```python
      print(soup.find_all("img", {"src": re.compile('.*?\.jpg')}))
      - 用正则表达式把src中含jpg的全部提取出来

图片的懒加载

暂时还解决不了

requests板块

get

  • get用于请求目标网站的内容
1
2
3
4
5
6
7
response = requests.get('http://www.baidu.com')
print(response.status_code) # 打印状态码
print(response.url) # 打印请求url
print(response.headers) # 打印头信息,是一个字典,也可以访问具体键值
print(response.cookies) # 打印cookie信息
print(response.text) #以文本形式打印网页源码
print(response.content) #以字节流形式打印

Session()

  • 一般cookie数据保存在客户端,session数据保存在服务器端

  • 使用requests.Session()的时候,当前这个会话对象会保留之前所有的cookie数据,而用其他的命令每次都是新建立一个请求,比如get一个新的,post一个新的

  • s = requests.Session()
    response = s.get(url)