一、认识爬虫
爬虫:一段自动抓取互联网信息的程序,即从互联网中的一个URL出发,访问它所能达到的所有URL,并且获取到需要的价值数据。
二、必备网页基础知识
- HTML :构建整个网页骨架
- CSS :美化网页
- JavaScript :赋予网页灵魂(动)
- HTML DOM:定义了所有 HTML 元素的对象和属性,以及访问它们的方法
三、爬虫基本步骤
- 发送请求
- 获取响应内容
- 解析内容
- 保存数据
四、Request库
作用:自动爬取HTML页面;自动网络请求提交
4.1 Requests请求方式:get与post
1.get():获取HTML网页的主要方法,对应于HTTP的GET,可以直接请求打开
公式:requests.get(url,headers=?,params=?,**kwargs)
2.post():向HTML网页提交POST请求的方法,对应于HTTP的POST,其请求参数在请求体中,消息长度没有限制且以隐式的方式进行发送。
公式:requests.post(url,data=?,headers=?,json=?,**kwargs)
4.2 Requests的两个重要对象
request:构造一个向服务器请求资源的Request对象
请求方式:GRT 和POST
请求URL:统一资源定位符
请求头:包含请求头部信息,比如:User-Agent
请求体:请求额外携带的数据
response:返回一个包含服务器资源的Response对象
Response对象包含服务器返回的所有信息,也包含请求的Request信息
五、Request库的基本应用
5.1 爬取python之禅 (requests.get的应用)
import requests
url = 'https://www.python.org/dev/peps/pep-0020/'
res = requests.get(url)
text = res.text
text
可以看到返回的其实就是开发者工具下Elements的内容,只不过是字符串类型,接下来我们要用python的内置函数find来定位“python之禅”的索引,然后从这段字符串中取出它
通过观察网站,我们可以发现这段话在一个特殊的容器中,通过审查元素,使用快捷键Ctrl+shift+c快速定位到这段话也可以发现这段话包围在pre标签中,因此我们可以由这个特定用find函数找出具体内容
## 爬取python之禅并存入txt文件
with open('zon_of_python.txt', 'w') as f:
f.write(text[text.find('<pre')+28:text.find('</pre>')-1])
print(text[text.find('<pre')+28:text.find('</pre>')-1])
利用python自带的urllib完成以上操作:
import urllib
url = 'https://www.python.org/dev/peps/pep-0020/'
res = urllib.request.urlopen(url).read().decode('utf-8')
print(res[res.find('<pre')+28:res.find('</pre>')-1])
5.2 金山词霸 (requests.post的应用)
import requests
def translate(word):
url="http://fy.iciba.com/ajax.php?a=fy"
data={
'f': 'auto',
't': 'auto',
'w': word,
}
headers={
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36',
}#User-Agent会告诉网站服务器,访问者是通过什么工具来请求的,如果是爬虫请求,一般会拒绝,如果是用户浏览器,就会应答。
response = requests.post(url,data=data,headers=headers) #发起请求
json_data=response.json() #获取json数据
#print(json_data)
return json_data
def run(word):
result = translate(word)['content']['out']
print(result)
return result
def main():
with open('zon_of_python.txt') as f:
zh = [run(word) for word in f]
with open('zon_of_python_zh-CN.txt', 'w') as g:
for i in zh:
g.write(i + '\n')
if __name__ == '__main__':
main()
5.3 进阶:爬取豆瓣电影
import requests
import os
if not os.path.exists('image'):
os.mkdir('image')
def parse_html(url):
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36"}
res = requests.get(url, headers=headers)
text = res.text
item = []
for i in range(25):
text = text[text.find('alt')+3:]
item.append(extract(text))
return item
def extract(text):
text = text.split('"')
name = text[1]
image = text[3]
return name, image
def write_movies_file(item, stars):
print(item)
with open('douban_film.txt','a',encoding='utf-8') as f:
f.write('排名:%d\t电影名:%s\n' % (stars, item[0]))
r = requests.get(item[1])
with open('image/' + str(item[0]) + '.jpg', 'wb') as f:
f.write(r.content)
def main():
stars = 1
for offset in range(0, 250, 25):
url = 'https://movie.douban.com/top250?start=' + str(offset) +'&filter='
for item in parse_html(url):
write_movies_file(item, stars)
stars += 1
if __name__ == '__main__':
main()
用urllib.request爬取的电影名及其基本信息:
import urllib.request
import bs4
#伪装成浏览器访问
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/70.0.3538.110 Safari/537.36"}
def get_page(url):
request = urllib.request.Request(url, headers=headers)
response = urllib.request.urlopen(request)
html = response.read().decode("utf-8")
return html
def parse_html(html):
soup = bs4.BeautifulSoup(html, "lxml")
movies_lists_soup = soup.find("ol", attrs={"class": "grid_view"})
movies_list_soup = movies_lists_soup.find_all("li")
for movies_soup in movies_list_soup:
movie_name = movies_soup.find('span', attrs={"class": 'title'}).text
movie_star = movies_soup.find('p').text
print(movie_name, end=" ")
print(movie_star)
def main():
i = 0
while i < 10:
url = "https://movie.douban.com/top250?start=" + str(i * 25) + "&filter="
html = get_page(url)
data = parse_html(html)
i += 1
if __name__ == '__main__':
main()