爬虫入门第一篇
目录
get与post请求
请求头
正则表达式应用
get与post请求
(一)get与post的区别
get方法:
所谓的get方法,便是利用程序使用HTTP协议中的GET请求方式对目标网站发起请求。
1、用来请求资源;
2、url中传输实体数据
3、传输的数据量少
简单案例:
(未断网)尝试使用requests或者是urllib用get方法向https://www.baidu.com/发出一个请求,并将其返回结果输出。
import requests
url = 'https://www.baidu.com/'
response = requests.get(url=url)
print(response)
#<Response [200]>
(断网)尝试使用requests或者是urllib用get方法向https://www.baidu.com/发出一个请求,并将其返回结果输出。
import requests
url = 'https://www.baidu.com/'
response = requests.get(url=url)
print(response)
#Failed to establish a new connection: [Errno 11001] getaddrinfo failed’
post方法:
post请求方式的使用和get方式并没有很大的区别,本质的区别在于它传递参数的方式并不像get方式一样,通过在url中拼接字段来发送给服务器,他采取了一种相较之下更为安全的操作方式,通过form表单的方式来向服务器传递查询条件。我们同样可以通过浏览器的F12开发者工具或者fiddler抓包工具来看到formdata这个字段,从中获取form表单中的字段信息,很多登录操作就是基于此。
1、用来传输实体数据(本质上更加专业)
2、在实体数据中传输数据
3、传输的数据量大
响应转状态码
200:成功
302:临时转移到新的url
403:forbidden
404:not found
500:服务器内部错误
请求头
(一)什么是请求头:
以上的一个get案例,这并不是一个完整的请求,因为服务器在接收到你的程序的请求信息时,它可以明确的从Request headers中看到你是在用程序发起请求接收响应,为了完善我们的请求,可以自定义请求头信息,利用get()方法的headers参数。
我们可以从浏览器的F12开发者工具中Network下找到请求网址的headers信息,保存下来作为我们自定义参数。
详情:https://blog.csdn.net/qq_42820268/article/details/82424353
(二)如何添加请求头
edge:https://www.cnblogs.com/stuqx/p/7253321.html
正则表达式应用
豆瓣电影top250抓取名次、影片名称、年份、导演等字段
from bs4 import BeautifulSoup
import requests
import os
def get_html(web_url): # 爬虫获取网页没啥好说的
header = {
"User-Agent":"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16"}
html = requests.get(url=web_url, headers=header).text#不加text返回的是response,加了返回的是字符串
Soup = BeautifulSoup(html, "lxml")
data = Soup.find("ol").find_all("li") # 还是有一点要说,就是返回的信息最好只有你需要的那部分,所以这里进行了筛选
return data
def get_info(all_move):
f = open("F:\粤西北\路况\douban\\douban.txt", "a")
for info in all_move:
# 排名
nums = info.find('em')
num = nums.get_text()
# 名字
names = info.find("span") # 名字比较简单 直接获取第一个span就是
name = names.get_text()
# 导演
charactors = info.find("p") # 这段信息中有太多非法符号你需要替换掉
charactor = charactors.get_text().replace(" ", "").replace("\n", "") # 使信息排列规律
charactor = charactor.replace("\xa0", "").replace("\xee", "").replace("\xf6", "").replace("\u0161", "").replace(
"\xf4", "").replace("\xfb", "").replace("\u2027", "").replace("\xe5", "")
# 评语
remarks = info.find_all("span", {"class": "inq"})
if remarks: # 这个判断是因为有的电影没有评语,你需要做判断
remark = remarks[0].get_text().replace("\u22ef", "")
else:
remark = "此影片没有评价"
print(remarks)
# 评分
scores = info.find_all("span", {"class": "rating_num"})
score = scores[0].get_text()
f.write(num + '、')
f.write(name + "\n")
f.write(charactor + "\n")
f.write(remark + "\n")
f.write(score)
f.write("\n\n")
f.close() # 记得关闭文件
if __name__ == "__main__":
if os.path.exists("F:\粤西北\路况\douban") == False: # 两个if来判断是否文件路径存在 新建文件夹 删除文件
os.mkdir("F:\粤西北\路况\douban")
if os.path.exists("F:\粤西北\路况\douban\\douban.txt") == True:
os.remove("F:\粤西北\路况\douban\\douban.txt")
page = 0 # 初始化页数,TOP一共有250部 每页25部
while page <= 225:
web_url = "https://movie.douban.com/top250?start=%s&filter=" % page
all_move = get_html(web_url) # 返回每一页的网页
get_info(all_move) # 匹配对应信息存入本地
page += 25
效果: