一、爬虫基础-Requests&BeautifulSoup
心得体会:爬虫基本原理就是模仿浏览器的行为,来爬取我们所需要的数据。利用Request向指定地址发送请求,并且获取其返回值。在爬取数据时,根据情况所需,添加请求头,或者COOKIE。有时候爬取的对象的防爬策略比较高深,需要根据浏览器的开发者工具中Network工具,来一步一步分析我们所爬取对象的数据与后台交互的过程,进一步的完善爬虫,更像一个浏览器在访问。
知识点总结:Requests的基本使用,需要掌握请求的类型('method'),请求地址('url'),请求时的所带数据('data', 'json', 'params'),数据的类型('POST', 'GET'),请求头('headers'),COOKIE。
import requests r1 = requests.request( method='get', url='', ) r2 = requests.request( method='post', url='', )
BeautifulSoup是一个格式化工具,必须掌握最基本的标签查找,页面标签的内容提取。
代码演示:
from bs4 import BeautifulSoup import requests r = requests.request( method='get', url='https://github.com/login', headers={ 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36' }, ) r.encoding = r.apparent_encoding key = BeautifulSoup(r.text, 'html.parser').find( name='input', attrs={ 'name': 'authenticity_token' }, ).get('value') r2 = requests.request( method='post', url='https://github.com/session', cookies=r.cookies, headers={ 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36' }, data={ 'commit': 'Sign in', 'utf8': '✓', 'authenticity_token': key, 'login': '[email protected]', 'password': 'WaveCloud999', } ) r3 = requests.request( method='get', url='https://github.com/WaveCloud592', cookies=r2.cookies, headers={ 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36' }, ) r3.encoding = r3.apparent_encoding myinfo = BeautifulSoup(r3.text, 'html.parser') # # 头像 img = myinfo.find( name='img', attrs={ 'alt': '@WaveCloud592' }, ).get('src') imgFile = requests.request( method='get', url=img ) with open('img.png', 'wb') as f: f.write(imgFile.content) # # 名字 name = myinfo.find( name='span', attrs={ 'itemprop': 'name' }, ) print('我的名字:%s' % name.text) # # 用户名 name = myinfo.find( name='span', attrs={ 'itemprop': 'additionalName' }, ) print('我的用户名:%s' % name.text) # # 我的签名 cont = myinfo.find( name='div', attrs={ 'class': 'js-user-profile-bio-contents' }, ).find( name='div' ) print('我的个性签名:%s' % cont.text) # # 我的组织 group = myinfo.find( name='span', attrs={ 'class': 'p-org', }, ).find( name='div' ) print('我的组织:%s' % group.text) # # 地区 diqu = myinfo.find( name='span', attrs={ 'class': 'p-label' }, ) print('地区:%s' % diqu.text) # # 我的网址 url = myinfo.find( name='a', attrs={ 'class': 'u-url' }, ) print('我的网址:%s' % url.text)