爬虫学习task1

爬虫task1
1.1
实验代码:
import requests
url = “https://www.baidu.com/
re = requests.get(url)
print(re.status_code)
有网时返回响应状态码:200
无网时返回响应:requests.exceptions.ConnectionError 连接错误
print(,type(re.status_code),re.status_code) 可以知道当前状态码是多少,在做对比,查看具体问题,在做进一步解决。
常见响应状态码错误:
404 代表页面未找到 ;200代表服务正常响应;500代表服务器内部发生错误。更多具体可以参考书籍崔庆才的python3 网络爬虫开发实战第85页。
请求头(Requests Headers),用来说明服务器要使用的附加信息,比较重要的信息有:Cookies,Referer , User-Agent等。User-Agent简称UA,他是一个特殊的字符,在做爬虫任务时加上此信息,可以伪装成浏览器;如果不加,很可能被识别出爬虫。
添加请求头如下:
import requests
headers ={
“User-Agent”:“Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36”
}
url = “https://www.baidu.com/
re = requests.get(url)
print(re)

代码中 headers 就是我们的请求头。比如打开百度网页,按F12 键或审查元素,会出来网页结构等代码,点击www.baidu.com–>headers -->Requests Headers
中用红色标出的就是我们的请求头,一般至少还有 User-Agent,也可以加上其他的。

1.2正则表达式
正则表达式就是用一定的规则将特定的文本提取出来,python的re库提供了整个正则表达式的实现。首先要了解正则表达式额一些匹配规则,它的一些常用方法有:
match() result= re.match(正则表达式,传入要匹配的字符串)
print(result) 输出SRE_Match对象,就证明匹配成功
print(result.group()) 输出匹配内容
print(result.span()) 输出匹配范围
匹配目标:match()方法可以得到匹配的字符串内容,但从想字符串提取一部分,可以用 括号()将想要提取的部分括起来,()括号标记了提取部分的开始和结束的位置,被标记的每个子表达式分依次对应一个分组,调用group方法获取结果。
如Print(result.group())会输出全部匹配的内容,而Print(result.group(1))会输出第一个被括起来的匹配结果。
通用匹配:这是一个万能的匹配,为我们减少大量的工作。那就是.*(点星),其中.(点)可以匹配任意字符(除换行符),*代表匹配前面的字符无限次。所以合在一起就可以任意匹配字符了。.*简化正则表达式的书写。
贪婪匹配和非贪婪匹配的用法:.是贪婪匹配,尽可能匹配多的字符,而.?尽可能匹配少的字符。
修饰符re.S:这个修饰符的作用就是使.匹配包括换行符在内的所有字符,在HTML中经常有换行,加上它就可以匹配节点与节点之间的换行了。
转义匹配:当遇到正则表达式模式的特殊字符,比如 (,),.,等,在前面加上\即可。
search() :match方法是从头开始匹配,如果开头就不匹配,那么就不能匹配。但是把match(0 换成search(),它会扫描整个字符串,然后返回第一个匹配的字符串,然后返回匹配结果,如果搜索完了还没有找到,就返回None.
re.search(‘正则表达式’,html字符串,re.S)
findall() : search()方法返回匹配的第一个结果,如果想返回所有匹配的结果,就用到findall(),该方法会搜索整个字符串,然后返回所有匹配正则表达式的内容。re.findall(‘正则表达式’,html字符串,re.S)
sub() : 利用它来修改文本,re.sub(‘替换对象字符’,’替换结果’,re.S)
compile() :这个方法可以将正则表达式编译成正则表达式对象,以方便在后面的匹配中重复使用。大概知道用法就行,详细操作可以在使用时具体看看。
接下来爬doubantop250电影信息。
url = https://movie.douban.com/top250
代码如下:
import csv
import requests
import re

def get_one_page(url):
headers = {
“User-Agent”: “Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36”
}
result = requests.get(url,headers)
result = result.text
return result
def parse_one_page(result):
# 解析一页代码
pattern = re.compile(

. ?<em.?>(. ?).?“title”>(. ?).?/ (. ?).?other">. ?/ (.?)’
‘. ?导演:(.?)&nbsp. ?主演:(.?)
. ?(.?) / (. ?) / (.?). ?

.?"rating(. ?)">.?’
‘average">(. ?).?inq">(.*?)’, re.S)
items = re.findall(pattern, result)
for item in items: ##转化成字典型 ,以便存储为结构性数据文件
yield{
‘排名’:item[0],
‘名称’: item[1],
‘别称’: item[2] + item[3],
‘导演’: item[4],
‘主演’: item[5],
‘上映时间’: item[6].strip()[:4],
‘地区’: item[7],
‘类型’: item[8],
‘星评’: item[9],
‘评分’: item[10],
‘主题’: item[11]
}
#存入CSV文件
def save_to_file(items):
with open(“doubantop250.csv”,‘a’, encoding=‘utf-8’,) as csvfile:
#文件标题
fieldnames = [‘排名’,‘名称’,‘别称’,‘导演’,‘主演’,‘上映时间’,‘地区’,‘类型’,‘星评’,‘评分’,‘主题’]
writer = csv.DictWriter(csvfile,fieldnames = fieldnames)
writer.writeheader()
for item in items:
writer.writerow(item)

def main(offset):
url = “https://movie.douban.com/top250?start="+str(offset)+"&filter=
result = get_one_page(url)
items = parse_one_page(result)
save_to_file(items)

if name== ‘main’:
for i in range(10):
offset = i*25
main(offset)
time.sleep(3)

爬取结果部分显示

排名,名称,别称,导演,主演,上映时间,地区,类型,星评,评分,主题

1,肖申克的救赎,The Shawshank Redemption月黑高飞(港) / 刺激1995(台), 弗兰克·德拉邦特 Frank Darabont, 蒂姆·罗宾斯 Tim Robbins /…,1994,美国,5-t,9.6,希望让人自由。

2,霸王别姬,再见,我的妾 / Farewell My Concubine杀手莱昂 / 终极追杀令(台), 吕克·贝松 Luc Besson, 让·雷诺 Jean Reno / 娜塔莉·波特曼 …,1994,法国,45-t,9.4,怪蜀黍和小萝莉不得不说的故事。

4,阿甘正传,Forrest Gump福雷斯特·冈普, 罗伯特·泽米吉斯 Robert Zemeckis, 汤姆·汉克斯 Tom Hanks / …,1994,美国,45-t,9.4,一部美国近现代史。

5,美丽人生,La vita è bella一个快乐的传说(港) / Life Is Beautiful, 罗伯托·贝尼尼 Roberto Benigni, 罗伯托·贝尼尼 Roberto Beni…,1997,意大利,5-t,9.5,最美的谎言。

6,泰坦尼克号,Titanic铁达尼号(港 / 台), 詹姆斯·卡梅隆 James Cameron, 莱昂纳多·迪卡普里奥 Leonardo…,1997,美国,45-t,9.3,失去的才是永恒的。

7,千与千寻,千と千尋の神隠し神隐少女(台) / Spirited Away, 宫崎骏 Hayao Miyazaki, 柊瑠美 Rumi Hîragi / 入野自由 Miy…,2001,日本,45-t,9.3,最好的宫崎骏,最好的久石让。

8,辛德勒的名单,Schindler's List舒特拉的名单(港) / 辛德勒名单, 史蒂文·斯皮尔伯格 Steven Spielberg, 连姆·尼森 Liam Neeson…,1993,美国,5-t,9.5,拯救一个人,就是拯救整个世界。

9,盗梦空间,Inception潜行凶间(港) / 全面启动(台), 克里斯托弗·诺兰 Christopher Nolan, 莱昂纳多·迪卡普里奥 Le…,2010,美国 英国,45-t,9.3,诺兰给了我们一场无法盗取的梦。

10,忠犬八公的故事,Hachi: A Dog's Tale忠犬小八(台) / 秋田犬八千(港), 莱塞·霍尔斯道姆 Lasse Hallström, 理查·基尔 Richard Ger…,2009,美国 英国,45-t,9.3,永远都不能忘记你所爱的人。

11,机器人总动员,WALL·E瓦力(台) / 太空奇兵·威E(港), 安德鲁·斯坦顿 Andrew Stanton, 本·贝尔特 Ben Burtt / 艾丽…,2008,美国,45-t,9.3,小瓦力,大人生。

12,三傻大闹宝莱坞,3 Idiots三个傻瓜(台) / 作死不离3兄弟(港), 拉库马·希拉尼 Rajkumar Hirani, 阿米尔·汗 Aamir Khan / 卡…,2009,印度,45-t,9.2,英俊版憨豆,高情商

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值