网页一般是由HTML文件和css文件共同渲染组成的,我们在网络爬虫爬取网页信息的时候通常爬取的是网页中的html文件

正则表达式

正则就是用一些具有特殊意义的符号组合在一起,来描述字符或者字符串的方法,或者,正则就是用来描述一类事物的规则
常用到的函数有findall,search等
关于正则表达式的更多知识可以参考正则表达式—菜鸟教程

beautiful soup的安装

pip install beautifulsoup4

练习:百度百科的爬取

模块的导入

  1. import re
  2. from bs4 import BeautifulSoup
  3. import random
  4. from urllib.request import urlopen
  1. base_url = 'https://baike.baidu.com'
  2. his = ['/item/%E7%BD%91%E7%BB%9C%E7%88%AC%E8%99%AB/5162711']
  3. url = base_url+his[-1]

爬取和输出

  1. html = urlopen(url).read().decode('utf-8')
  2. soup = BeautifulSoup(html,features='lxml')
  3. print(soup.find('h1').get_text(),'\t url':his[-1])
  4. sub_urls = soup.find_all('a',{'target':'_blank'})

循环多次的爬取

  1. import re
  2. from bs4 import BeautifulSoup
  3. import random
  4. from urllib.request import urlopen
  5. ##导入模块
  6. base_url = 'https://baike.baidu.com'
  7. his = ['/item/%E7%BD%91%E7%BB%9C%E7%88%AC%E8%99%AB/5162711']
  8. ##定义第一层爬取时的网址
  9. for i in range(20):
  10. url = base_url+his[-1]
  11. html = urlopen(url).read().decode('utf-8')#获取html文件的utf-8的文本形式
  12. soup = BeautifulSoup(html,features='html.parser')#BeautifulSoup函数处理,得到相应的返回值
  13. print(soup.find('h1').get_text(),'\t url:',his[-1])#返回得到的内容和对应的网址
  14. sub_urls = soup.find_all('a',{'target':'_blank','href':re.compile('/item/(%.{2})+$')})
  15. #上述的正则表达式中的%是中文字符转为utf-8的编码形式的时候出现的%‘.’表示出现空白字符以外的任意字符,
  16. #‘{2}+’表示前面所述的字符出现两次及以上$表示结束符,其中的括号表示要获取的字符字段。
  17. # print(sub_urls,type(sub_urls),sub_urls.shape())
  18. # print(sub_urls)
  19. if len(sub_urls) !=0:
  20. his.append(random.sample(sub_urls,1)[0]['href'])#将sub_urlshref的值append到原先的列表中
  21. else:#若没有爬取到有效的值
  22. his.pop()#默认删除最后一个元素
  23. print(his)

最终结果展示

image.png
可以看出来his的值的数目越来越多

request模块

网页在加载的时候会有若干种加载的形式,这几种形式即使打开网页的关键,最重要的类型就是getpost(也有其他的,比如head``delete)
最常使用到的就是**get****post**在95%的时间里都是在使用post和get

  • post

    账号登陆 搜索内容 上传图片 上传文件 向服务器传输数据

  • get

    正常打开网页 不往服务器传数据

  1. import requests
  2. import webbrowser
  3. #get获取信息
  4. # param={'wd':'罗育欣'}
  5. # r=requests.get('https://www.baidu.com/s',params=param)
  6. # print(r.url)
  7. # webbrowser.open(r.url)
  8. #post提交信息
  9. data = {'firstname':'XC','lastname':'zhang'}
  10. r=requests.post('https://pythonscraping.com/pages/files/processing.php',data=data)
  11. # webbrowser.open(r.url)
  12. print(r.text)
  • post形式返回的链接中不会有自己输入的信息
  • get形式返回的链接中会出现自己刚才输入的信息

    post提交照片

    1. file={'uploadFile':open('imges/nomad.jpg','rb')}
    2. r = requests.post('https://pythonscraping.com/files/processing2.php',files=file)
    3. print(r.text)

    对于网页的连续状况的处理

    网页处理连续的状况,相当于实现在浏览器中存储了一个cookie,使用cookie进行下一步的命令

    cookie的理解

    Cookie是保存在客户端的纯文本文件,比如txt文件,所谓的客户端就是我们自己使用的电脑,当我们使用自己的电脑通过浏览器进行访问网页的时候,服务器就会生成一个证书并写入我们本地的电脑

session进行网站的连续操作

  1. session = requests.session()
  2. payload = {'username':'zxc','password':'password'}
  3. r = session.post('https://pythonscraping.com/pages/cookies/welcome.php',payload)
  4. print(r.cookies.get_dict())
  5. r = session.get('https://pythonscraping.com/pages/cookies/profile.php')
  6. print(r.text)

该种方式个人感觉与神经网络的搭建有些相似,都是创建好一个模型之后进行连续的操作,