from urllib.request import urlopen
url="http://www.baidu.com"
resp=urlopen(url)
with open("mybaidu.html",mode="w",encoding='utf-8') as f: #用with语句打开文件,w表示写入模式,将文件对象赋值给变量f
f.write(resp.read().decode("utf-8")) # 读取到网页到页面源代码
print("over!")
# 1.服务器渲染:在服务器那边直接把数据和html整合在一起。统一返回给浏览器,在页面源代码中能看到数据
# 2.客户端渲染:第一次请求只要一个html骨架,第二次请求拿到数据,进行数据展示,在页面源代码中,看不到数据
# 熟练使用浏览器抓包
# HTTP协议(超文本传输协议),说直白点,就是浏览器和服务器之间的数据交互遵守的协议
# HTTP协议把一条消息分为三大块内容,无论是请求还是响应都是三块内容
# 请求:
# 1.请求行 -> 请求方式(get/post)请求url地址,协议
# 2.请求头 -> 放一些服务器要使用的附加信息
# 3.请求体 -> 一般放一些请求参数
#响应:
#1.状态行 -> 协议 状态码
#2.响应头 ->放一些客户端要使用的附加信息
#3.响应体 -> 服务器反回的真正客户端要用的内容(HTML,json等)
import re
#findall 匹配字符串中所有的符合正则的内容
lst=re.findall(r"\d+","我的电话是10086,我女朋友电话是10010")
print(lst)
#finditer 匹配字符串中所有的内容,返回的是迭代器
it= re.finditer(r"\d+","我的电话是10086,我女朋友电话是10010")
for i in it:
print(i.group())
#search 找到第一个结果就返回,返回结果是match对象
s=re.search(r"\d+","我的电话是10086,我女朋友电话是10010")
print(s.group())
# match 是从头开始匹配
s=re.match(r"\d+","我的电话是10086,我女朋友电话是10010")
print(s.group())
# 预加载正则表达式
obj=re.compile(r"\d+")
ret=obj.finditer("我的电话是10086,我女朋友电话是10010")
for it in ret:
print(it.group())
. 匹配除换行符以外的任意字符
\w 匹配字母或数字或下划线
\s 匹配任意的空白字符
\d 匹配数字
\t 匹配一个制表符
\n 匹配一个换行符
^ 匹配字符串的开始
$ 匹配字符串的结尾
\W 匹配非字母或数字或下划线
\D 匹配非数字
\S 匹配非空白符
\a|b 匹配字符aor字符b
() 匹配括号内的表达式,也表示一个组
[...]匹配字符组中的字符
[^...]匹配除了字符组中的字符的所有字符
* 重复0次或更多次
+ 重复一次或更多次
? 重复0次或一次
{n} 重复n次
{n,}重复n次或更多
{n,m}重复n到m次
.* 贪婪匹配
.*? 惰性匹配
import re
s="""
<div class='jay'><span id='1'>郭麒麟</span></div>
<div class='jj'><span id='2'>宋轶</span></div>
<div class='jolin'><span id='3'>大聪明</span></div>
<div class='sylar'><span id='4'>范思哲</span></div>
<div class='tory'><span id='5'>陶喆</span></div>
"""
#(?P<分组名字>正则)可以单独从正则匹配的内容中提取内容
obj=re.compile(r"<div class='.*?'><span id='\d+'>(?P<wahaha>.*?)</span></div>")
res=obj.finditer(s)
for it in res:
print(it.group("wahaha"))
#拿到页面源代码 requests
#通过re来提取想要的有效信息 re
import requests
import re
import csv
url="https://movie.douban.com/top250"
headers={
"user-agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36"
}
resp=requests.get(url,headers=headers)
page_content=resp.text
#解析数据
obj=re.compile(r'<li>.*?<div class="item">.*?<span class="title">(?P<name>.*?)</span>.*?'
r'<div class="bd">.*?<p>.*?<br>(?P<time>.*?) .*?'
r'<span class="rating_num" property="v:average">(?P<score>.*?)</span>.*?'
r'<span>(?P<num>.*?)</span>.*?',re.S)
res=obj.finditer(page_content)
f=open("data.csv",mode='w')
csvwriter=csv.writer(f)
for it in res:
dic=it.groupdict()
dic['time']=dic['time'].strip()
csvwriter.writerow(dic.values())
#print(it.group('name')+it.group('time')+' '+it.group('score')+' 分 '+it.group('num'))
f.close()
resp.close()
import requests
import re
domain = "http://dygod.net/"
headers={
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36"
}
resp=requests.get(domain,headers=headers,verify=False)
resp.encoding="gb2312"
obj1=re.compile(r"华语电视剧.*?<ul>(?P<ul>.*?)</ul>",re.S)
res1=obj1.finditer(resp.text)
obj2=re.compile(r"<a href='(?P<link>.*?)'",re.S)
for it in res1:
ul=it.group('ul')
#提取子页面
res2 = obj2.finditer(ul)
for itt in res2:
#拼接子页面url
child_link=domain+itt.group('link').strip('/')
print(child_link)
#提取子页面内容
for link in child_link:
child_resp=requests(link,headers=headers,verify=False)
child_link.encoding = "gb2312"
print(child_resp.text)
break
resp.close()
scrapy教程
1. 创建项目
scrapy startproject 项目名称
- 进入项目
cd 项目名称
- 创建爬虫
scrapy genspider 爬虫名字 域名
- 可能需要修改start_urls,修改成需要抓取的页面
- 对数据进行解析,在spider中的parse(response)方法中进行解析
def parse(self,response):
response.text 拿页面源代码
response.xpath()
response.css()
解析数据的时候,需要注意,xpath()返回的的事selector对象
想要数据必须使用extract()提取数据
extract()返回列表
extract_first()返回一个数据
yield返回数据->把数据交给pipeline进行持久化存储
- pipeline中完成数据的存储
class 类():
def process_item(self,item,spider):
item:数据
spider:爬虫
return item #必须return东西,否则后续管道收不到
- 设置settings.py文件将pipeline进行生效设置
ITEM_PIPELINES = { ##这里打开管道
#key:管道的路径
#value:管道优先级 数字越低优先级越高
"game.pipelines.GamePipeline": 300,
}
- 运行爬虫
scrapy crawl 爬虫名字