爬虫入门训练

1 百度网站

如果使用如下代码之后会出现控制台打印的出来html代码,但是文件里面没有。所以需要修改。 

from urllib.request import urlopen

url = "http://www.baidu.com"
resp = urlopen(url)

print(resp.read().decode("utf-8"))
with open("mybaidu.html",mode="w") as f:
    f.write(resp.read().decode("utf-8"))
print("over!")

 修改后是这样的:

from urllib.request import urlopen

url = "http://www.baidu.com"
resp = urlopen(url)
ht = resp.read().decode("utf-8")
print(ht)
with open("mybaidu.html",mode="w") as f:
    f.write(ht)
print("over!")

但是仍然出现下面乱码情况

 原因可能是编码方式错误,所以出现乱码,修改如下:

with open("mybaidu.html",mode="w",encoding='utf-8') as f:

 运行结果正确:

 2 Web请求过程剖析

 1.服务器渲染:在服务器那边直接把数据和html整合在一起,统一返回给浏览器,在页面源代码中能看到数据。

2.客户端渲染:第一次请求只要html骨架,第二次请求拿到数据,进行展示,在页面源代码中,看不到数据。

 

 所以要熟练使用浏览器抓包工具:数据并不是在第一次请求里面,而是在第二次请求里面。而且请求为规则的json格式如下。

 3 http协议

 

 

4 request入门

  • get请求方式
import requests

query = input("请输入你喜欢的明星:")
url = f'https://www.baidu.com/s?wd={query}'

Hd = {
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36"
}
resp = requests.get(url, headers=Hd)  #处理一个小小的反爬

print(resp)
print(resp.text)
  • post请求方式

import requests

url = "https://fanyi.baidu.com/sug"

s = input("请输入你要翻译的英文:")
dat = {
    "kw":s
}
#发送post请求,发送的数据必须放入字典中,通过data参数进行传递
resp = requests.post(url , data=dat)
print(resp.json())  #将服务器返回的类容直接处理成json
  • 豆瓣demo

https://movie.douban.com/j/chart/top_listtype=24&interval_id=100%3A90&action=&start=0&limit=20URL:找问号前面是url,之后是参数

https://movie.douban.com/j/chart/top_listtype=24&interval_id=100%3A90&action=&start=0&limit=20

import requests

url = "https://movie.douban.com/j/chart/top_list"

param = {
    "type": "24",
    "interval_id": "100:90",
    "action":"",
    "start":1,
    "limit":20,
}
headers = {
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36"
}

resp = requests.get(url=url, params=param,headers=headers)
print(resp.status_code)
print(resp.text)
resp.close()

记得关掉resp,否则容易出错。 

 5 re解析正则表达式


在线正则表达式测试OSCHINA.NET在线工具,ostools为开发设计人员提供在线工具,提供jsbin在线 CSS、JS 调试,在线 Java API文档,在线 PHP API文档,在线 Node.js API文档,Less CSS编译器,MarkDown编译器等其他在线工具https://tool.oschina.net/regex

匹配方法: 

 

6 demo

代码:

#拿到页面源代码
#通过re提取想要的有效信息 re
import requests
import re
import csv

#url = "https://www.jd.hk/"
url = "https://movie.douban.com/top250"

headers = {
    "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36"
}
resp = requests.post(url= url,headers= headers)
page_context = resp.text
#print(resp.text)
resp.close()

#解析数据
obj = re.compile(r'<li>.*?<div class="item">.*?<span class="title">(?P<name>.*?)</span>.*?<p class="">'
                 r'.*?<br>(?P<year>.*?)&nbsp.*?<span class="rating_num" property="v:average">'
                 r'(?P<score>.*?)</span>.*?<span>(?P<num>.*?)人评价</span>',re.S)
result = obj.finditer(page_context)
f = open("data.csv", mode="w",encoding="utf-8")
csvwriter = csv.writer(f)
for it in result:
    '''
    print(it.group("name"))
    print(it.group("year").strip())
    print(it.group("score"))
    print(it.group("num"))
    '''
    dic = it.groupdict()#字典
    dic['year'] = dic['year'].strip()
    csvwriter.writerow(dic.values())
f.close()
print("over!")

 

 运行结果:

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值