学习心得:
1.课程讲的十分详细,对初学者来讲是个不错的选择
2.wusir直播时讲拉钩登录讲了不少注意项,让本身也发现了本身的错误点
3.alex鸡汤太少了!!alex鸡汤太少了!!alex鸡汤太少了!!alex鸡汤太少了!!css
4.做为一个爬虫初学者来讲除了扎实得基础外最主要得是学会如何使用爬虫库,集训营得课程里wusir讲爬虫库讲得十分详细而且经过实例来让咱们更加的深刻,这样对于初学者来讲是个很好的。能让初学者少踩不少坑,也让接触过爬虫同窗有了更加深刻得认知,对于可能会出错得地方进行总结。拿拉钩跟github来讲网页反爬得那个token可能不少初学者不懂得如何获取跟写入,在直播里wusir用拉钩作了例子详细教咱们分析如何获取跟使用让咱们受益良多html
第三方库---requests
1.安装
pip install requests
注意使用python3时在linux系统下多是 pip3
2.requests部分经常使用参数
1.url 必填 须要访问的网址
2.params 选填 发送请求的参数,有的URL已经拼接好不须要重复发送(GET请求)
3.data 选填 发送请求的参数,有的URL已经拼接好不须要重复发送(POST请求)
4.headers 选填 请求头,有些网站必须验证请求头好比USER-AGENT
5.cookies 选填 用户数据 有的网站会验证是否登录可使用cookie
补充:
1.post请求里data为 http请求里的 body /r/n/r/n body
3.发送请求
1.get请求
response = requests.get(url='www.baidu.com',params={'例子':'例子'},headers={'host':'www.baidu.com')#发送请求
response.encoding = 'utf-8'#设定编码
response.text #返回文本
2.post请求
response = requests.post(url='www.baidu.com',data={'例子':'例子'},headers={'host':'www.baidu.com')
....
第三方库---beautifulsoup
1.安装
pip install bs4
2.分析网页
soup = BeautifulSoup(html,'lxml')#html为请求后的text内容(html源码),lxml为解析库
soup.find(name='标签名',attrs={'id':'values'})#name标签名,attrs标签属性
实例:模拟登录github
#-*- coding: utf-8 -*-
# Author:w kpython
'''
1.访问登录页面而且分析获得authenticity_token
2.把附带刚刚authenticity_token的cookie和帐号密码参数POST请求
3.请求后获取登录的用户名~
4.访问用户名的我的空间而且获取信息
'''linux
import requests
from bs4 import BeautifulSoup
from config import *git
def login(username, password, token, cookies):
doc = BeautifulSoup(token, 'lxml')
token = doc.find(name='input', attrs={'name': 'authenticity_token'}).get('value')
data = {
"commit": "Sign+in",
"utf8": "✓",
"authenticity_token": token,
"login": username,
"password": password,
}
result = requests.post(url=LOGIN_URL, data=data, headers=HEADERS, cookies=cookies)
if result.status_code == 200 or 302:
# 若是返回的状态吗是200或者302则表明登录成功,接着分析网页获取当前登录的用户名返回
status = BeautifulSoup(result.text, 'lxml')
user = status.find(name='strong', attrs={"class": "css-truncate-target"}).text
return user, result.cookies.get_dict()
return Nonegithub
def getPage(url, cookie=None, need_cookie=False):
'''
获取页面html代码,有的网页须要登录因此能够选择是否传入cookie
need_cookie能够在获取后返回cookie
:param url:
:param cookie:
:param need_cookie:
:return:
'''
try:
if cookie:
response = requests.get(url, cookies=cookie, headers=HEADERS)
else:
response = requests.get(url, headers=HEADERS)
if response.status_code == 200:
if need_cookie:
return response.text, response.cookies.get_dict()
return response.text
return None
except Exception as E:
print('请求失败~')
return Nonecookie
def parseInformation(html):
'''
使用try能够防止有的用户没有填写那处的资料出错
:param html:
:return:
'''
doc = BeautifulSoup(html, 'lxml')
nickname = doc.find(name='span', attrs={'itemprop': 'name'}).string
username = doc.find(name='span', attrs={'itemprop': 'additionalName'}).string网络
try:
bio = doc.find(name='div', attrs={'class': 'd-inline-block mb-3 js-user-profile-bio-contents'}).div.string
except AttributeError:
bio = Nonepost
try:
company = doc.find(name='span', attrs={'class': 'p-org'}).div.string
except AttributeError:
company = None学习
try:
location = doc.find(name='span', attrs={'class': 'p-label'}).string
except AttributeError:
location = None
try:
email = doc.find(name='a', attrs={'class': 'u-email'}).string
except AttributeError:
email = None
try:
url = doc.find(name='a', attrs={'class': 'u-url'}).string
except AttributeError:
url = None
Information = '''=====用户我的信息====
昵称:{nickname}
用户名:{username}
bio:{bio}
公司:{company}
位置:{location}
邮箱:{email}
网址:{url}
'''.format(nickname=nickname, username=username, bio=bio, company=company, location=location, email=email, url=url)
return Information
def main(user,pwd):
'''
程序入口:
先获取登录token,而后传入帐号密码和cookie,token登录后访问用户主页获取用户资料
:return:
'''
try:
result, cookie = getPage(url=TOKEN_URL, need_cookie=True)
except Exception:
print('没法得到Token或者Cookie')
exit(-1)
result = login(username=user, password=pwd, token=result, cookies=cookie)
if result:
# result[0]为用户名,[1]为cookie
user_url = 'https://github.com/' + result[0]
html = getPage(url=user_url, cookie=result[1])
if html:
information = parseInformation(html)
print(information)
else:
print('没法解析我的空间页面请重试')
exit(-1)
else:
print('登录出错,请检查用户名或者密码或者网络再从新尝试~')
exit(-1)
if __name__ == '__main__': main(user,pwd)