网页组成三部分:结构+表现+行为
html:结构
css:将结构和表现进行分离
js:网页的行为
1** 信息相应
2** 成功定位
3** 重定向
4** 客户端响应
5** 服务端响应
重要内容:
User-Agent
cookie
标准库:urllib 麻烦
第三方库:request
import requests
#在同一个session实例发出的所有请求之间保持cookie
s=requests.Session()
s.get("发出请求页面")
r=s.get("跳转的页面的url")
print(r.text)
#会话可以使用上下文管理器
with requests.Session() as s:
s.get('跳转的页面url')
#加入了翻页功能
import requests
#引入path功能
from lxml import etree
#控制请求频率
from time import sleep
def get_url_name(myurl):
ua= "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36"
header = {"user-agent":ua}
response = requests.get(myurl,headers=header)
selector= etree.HTML(response.text)
file_name=selector.xpath('//div[@class="hd"]/a/span[1]/text()')
file_link = selector.xpath('//div[@class="hd"]/a/@href')
#遍历对应关系字典
film_info= dict(zip(file_name,file_link))
for i in film_info:
print(f"电影名称:{i} \t\t 电影链接:{film_info[i]}\n")
if __name__ == '__main__':
urls=tuple(f"https://movie.******.com/top250?start={page*25}&filter=" for page in range(10) )
for page in urls:
get_url_name(page)
sleep(5)
自顶向下设计
从整体分析一个比较复杂的大问题
分析方法可以重用
拆分到你能解决的范畴
scrapy
主要内容摘自此链接
1.引擎(Scrapy)
用来处理整个系统的数据流处理, 触发事务(框架核心)
2.调度器(Scheduler)
用来接受引擎发过来的请求, 压入队列中, 并在引擎再次请求的时候返回. 可以想像成一个URL(抓取网页的网址或者说是链接)的优先队列, 由它来决定下一个要抓取的网址是什么, 同时去除重复的网址
3.下载器(Downloader)
用于下载网页内容, 并将网页内容返回给蜘蛛(Scrapy下载器是建立在twisted这个高效的异步模型上的)
4.爬虫(Spiders)
爬虫是主要干活的, 用于从特定的网页中提取自己需要的信息, 即所谓的实体(Item)。用户也可以从中提取出链接,让Scrapy继续抓取下一个页面
5.项目管道(Pipeline)
负责处理爬虫从网页中抽取的实体,主要的功能是持久化实体、验证实体的有效性、清除不需要的信息。当页面被爬虫解析后,将被发送到项目管道,并经过几个特定的次序处理数据。
6.下载器中间件(Downloader Middlewares)
位于Scrapy引擎和下载器之间的框架,主要是处理Scrapy引擎与下载器之间的请求及响应。
7.爬虫中间件(Spider Middlewares)
介于Scrapy引擎和爬虫之间的框架,主要工作是处理蜘蛛的响应输入和请求输出。
8.调度中间件(Scheduler Middewares)
介于Scrapy引擎和调度之间的中间件,从Scrapy引擎发送到调度的请求和响应。
#回答只能爬下两个,注释是一开始以为能爬下来好几个的样式
#anchor = selector.xpath(f'//div[@data-za-index="{i}"]//a[@class="UserLink-link"]/text()')
print(anchor)
import requests
from lxml import etree
from time import sleep
from pathlib import *
from queue import Queue
import json
def get_url_answer(myurl):
anchor = selector.xpath('//a[@class="UserLink-link"]/text()')
print(anchor)
content = selector.xpath('//span[@class="RichText ztext CopyrightRichText-richText"]/p/text()')
print(content)
answer = dict(zip(anchor,content))
return answer
if __name__ == '__main__':
textqueue = Queue(20)
usr = "https://www.zhihu.com/question/440183834"
ua = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36"
header = {"user-agent": ua}
response = requests.get(usr, headers=header)
selector = etree.HTML(response.text)
p = Path(__file__)
pyfile = p.resolve().parent
content_path = pyfile.joinpath("content.txt")
with open(content_path,"w",encoding="utf-8") as f:
f.write(json.dumps(get_url_answer(usr),ensure_ascii=False))
#False是因为dumps操作时自动转换为unicode编码,需要取消