PYTHON爬虫日记01

记录自己的学习爬虫日记

选用python作为编程语言

1.环境准备

python3.6+

mysql

pycharm

2.思路

以爬取猫眼top100为目标

​ 1.分析url的规律

​ https://maoyan.com/board/4?offset=10 发现他们的url通过url参数offset作为分页的偏移参数

​ 后续我们可以通过循环遍历自动爬取所有的分页

​ 2.根据url爬取对应的HTML

​ 爬取html有可能会触发反爬机制,可以通过配置headers进行避免(解决了,但是没完全解决)

​ 3.解析html页面

​ 通过引入python的解析包,将html解析成一颗树,然后根据树结构进行解析,解析的方法有很多种

​ 可以通过包内提供的api,也可以通过正则,最好是能结合起来灵活使用

​ 4.保存数据

​ 将解析html页面之后的数据,封装起来,保存到mysql

​ 5.将数据在可视化界面进行展示

3.开干

1.新建python项目

选择自己喜欢的目录,新建项目

2.引入包
from time import sleep   #延时访问,避免过于频繁导致封ip
import pymysql          #连接mysql,将数据存储
from bs4 import BeautifulSoup   #解析html
import re  # 正则表达式
import urllib.request, urllib.error  # 定制url 获取网页数据
3.功能测试

urllib.request 请求页面

import urllib.request
url = 'https://maoyan.com/board/4?offset=' # 请求url
headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36"}
req = urllib.request.Request(url, headers=headers)
response = urllib.request.urlopen(req)

pymysql 连接mysql

import pymysql#打开数据库连接conn = pymysql.connect(host='xxx.xx.xx.xx',# hostport = 3306, # 默认端口,根据实际修改user='root',# 用户名passwd='123456', # 密码db ='luke_db', # DB name)cur = conn.cursor()print(conn,cur)
cur.close()
conn.close()

能够成功输出,说明和mysql已经成功连接

mysql可以选择本地搭建,也可以远程连接,这里是我自己在linux搭建了一个mysql,通过远程连接实现的

bs4.BeautifulSoup 解析html页面

import urllib.request
from bs4 import BeautifulSoup
url = 'https://maoyan.com/board/4?offset=' # 请求url
headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36"}req = urllib.request.Request(url, headers=headers)
response = urllib.request.urlopen(req)
# print(response.read().decode('utf-8'))html = response.read().decode('utf-8')
html_parser = BeautifulSoup(html, "html.parser") #将请求返回的html进行解析,指定html.parser 解析器
html_a = html_parser.find_all("a") #抽取a标签
print(html_a)

可以看到输出的结果全是a标签
记录BeautifulSoup的一些常用方法

#1.Tag  标签及其内容;拿到它所找到的第一个内容# print(bs.title.string)
#
# print(type(bs.title.string))#2.NavigableString  标签里的内容(字符串)#print(bs.a.attrs)#print(type(bs))
#3.BeautifulSoup   表示整个文档#print(bs.name)
#print(bs)# print(bs.a.string)
# print(type(bs.a.string))#4.Comment  是一个特殊的NavigableString ,输出的内容不包含注释符号#-------------------------------#文档的遍历#print(bs.head.contents)
#print(bs.head.contents[1])

解析html还常用正则表达式,引入re包

import urllib.request
from bs4 import BeautifulSoup
import re
url = 'https://maoyan.com/board/4?offset=' # 请求url
headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36"}req = urllib.request.Request(url, headers=headers)
response = urllib.request.urlopen(req)
# print(response.read().decode('utf-8'))html = response.read().decode('utf-8')
html_parser = BeautifulSoup(html, "html.parser")
html_a = html_parser.find_all("a")   #取出A标签
html_a=str(html_a)#转字符串
find_maoyan_link = re.compile(r'.*?href="(.*?)"')#正则规则
html_href = re.findall(find_maoyan_link,html_a)#正则匹配
for item in html_href :#遍历打印print(item)
# print(html_href)

大致功能已经测试ok

4.完整的代码
import random
from time import sleep
import pymysql
from bs4 import BeautifulSoup
import re  # 正则表达式
import urllib.request, urllib.error  # 定制url 获取网页数据def main():parser_url_save()def parser_url_save():print("doing parser url ....")# 猫眼https://maoyan.com/board/4?offset=10# 豆瓣https://movie.douban.com/top250?start=25urls = ['https://maoyan.com/board/4?offset=','https://movie.douban.com/top250?start=']for url in urls:if url.find('https://maoyan.com') !=-1 :datalist = parser_html(url)# datalist = getData_maoyan(html)# print(datalist)saveData_maoyan(datalist)else :# parser_DOUBAN(url)print("parser douban ...")# 正则列表
# 猫眼标题
find_maoyan_title = re.compile(r'.*?title="(.*?)"')
# 猫眼链接
find_maoyan_link = re.compile(r'.*?href="(.*?)"')
# 猫眼图片
find_maoyan_pic = re.compile(r'.*?<img.*?data-src="(.*?)"')
# 猫眼评分
find_maoyan_score1 = re.compile(r'<p class="score"><i class="integer">(.*?)<')
find_maoyan_score2 = re.compile(r'</i><i class="fraction">(.*?)<')
# 主演
find_maoyan_star = re.compile(r'.*主演:(.*)')
# 上映时间
find_maoyan_date = re.compile(r'上映时间:(.*)<')def parser_html (url):cookie = '###'# agent=random.choice(user_agent)agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36"data_maoyan_list=[]for i in range (0,10) :sleep(3)url_tmp = url+str(i*10)headers = {"User-Agent":agent,"Cookie":cookie}req = urllib.request.Request(url_tmp, headers=headers)response = urllib.request.urlopen(req)html = response.read().decode("utf-8")data_maoyan_list = getData_maoyan(html,data_maoyan_list)return data_maoyan_listdef getData_maoyan (html,data_maoyan_list):html_parser = BeautifulSoup(html, "html.parser")base_url = 'https://maoyan.com/'item_list = html_parser.find_all('dd')for item in item_list:sleep(1)  # 延时访问# 单个电影的数据集data = []item_a = str(item.a)# 取标题title = re.findall(find_maoyan_title, item_a)[0]# 取链接curr_url = base_url + str(re.findall(find_maoyan_link, item_a)[0])# 取图片链接pic = re.findall(find_maoyan_pic, item_a)[0]# 评分item_p = item.select("p[class='score']")# if i * 10 == 20:#     print(item_p)score = "0.0"  # 存在没有评分的重置0.0if len(re.findall(find_maoyan_score1, str(item_p))) > 0:score = float(str(re.findall(find_maoyan_score1, str(item_p))[0]) + str(re.findall(find_maoyan_score2, str(item_p))[0]))# 主演# ’<p class="star">‘item_star = item.select("p[class='star']")# print(str(item_star))star = re.findall(find_maoyan_star, str(item_star))[0]# 上映时间  <p class="releasetime">item_releasetime = item.select("p[class='releasetime']")releasetime = re.findall(find_maoyan_date, str(item_releasetime))[0]# 添加到数据集中,title,curr_url,pic,score,star,releasetimedata.append(title)data.append(curr_url)data.append(pic)data.append(score)data.append(star)data.append(releasetime)data_maoyan_list.append(data)return data_maoyan_listdef saveData_maoyan(data_list):conn = pymysql.connect(host='xxx.xx.xx.xx',# hostport = 80, # 默认端口,根据实际修改user='root',# 用户名passwd='123456', # 密码db ='luke_db', # DB name)cur=conn.cursor()print(conn)# 获取了数据列表for id in range(0,len(data_list)):#     取得字段ind_id = str(id);title = '"'+str(data_list[id][0])+'"'  # 标题link = '"'+str(data_list[id][1])+'"'  # 连接pic_link = '"'+str(data_list[id][2])+'"'  # 图片连接score = str(data_list[id][3])  # 评分actor = '"'+str(data_list[id][4])+'"'  # 主演pub_date = '"'+str(data_list[id][5])+'"'  # 上映时间arr=[ind_id,title,link,pic_link,score,actor,pub_date]sql='''insert into luke_db.t_movie_top100_maoyan (xh,m_title,m_link,m_pic,m_score,m_actor,m_pubdate)values(%s)'''%",".join(arr)print(sql)print(cur.execute(sql))conn.commit() # 插入数据cur.close()conn.close()if __name__== '__main__':main()

这样一个简单的爬虫就实现了

查看一下数据库


可以看到数据已经导入数据库中了
后续就可以根据数据库的数据,进行可视化搭建了

python爬虫日记02-数据可视化搭建
大数据反爬日记01

python爬虫日记01相关推荐

  1. 爬虫python代码-Python爬虫入门(01) -- 10行代码实现一个爬虫

    跟我学习Python爬虫系列开始啦.带你简单快速高效学习Python爬虫. 一.快速体验一个简单爬虫 以抓取简书首页文章标题和链接为例 简书首页 就是以上红色框内文章的标签,和这个标题对应的url链接 ...

  2. python爬虫代码-Python爬虫入门(01) -- 10行代码实现一个爬虫

    跟我学习Python爬虫系列开始啦.带你简单快速高效学习Python爬虫. 一.快速体验一个简单爬虫 以抓取简书首页文章标题和链接为例 简书首页 就是以上红色框内文章的标签,和这个标题对应的url链接 ...

  3. 2021最新《python爬虫从0-1》5.正则表达式讲解

    正则表达式讲解 常用正则表达式 re库 re.search re.findall 教程地址 常用正则表达式 字符 描述 \d 代表任意数字,就是阿拉伯数字 0-9 这些玩意. \D 大写的就是和小写的 ...

  4. Python爬虫日记2——使用requests

    1基本用法 import requestsurl = 'https://www.baidu.com/' r = requests.get(url) print(type(r)) print(r.sta ...

  5. Python爬虫实战01:Requests+正则表达式爬取猫眼电影

    1 目标站点的分析 2 流程框架 抓取单页内容 利用requests请求目标站点,得到单个网页HTML代码,返回结果. 正则表达式分析 根据HTML代码分析得到电影的名称.主演.上映.时间.评分.图片 ...

  6. python爬虫作业帮_【Python爬虫】01作业

    习题0 在老师的帮助下完成,特别感谢程程老师! 习题1 #-*- coding: utf-8-*- print("Hello World!") print("Hello ...

  7. Python爬虫日记-解释def __init__(self, *args, **kwargs)

    编写python script的时候,经常需要使用def init(self, *args, **kwargs): 其含义代表什么? 这种写法代表这个方法接受任意个数的参数 如果是没有指定key的参数 ...

  8. python爬虫! 网站维护人员:真的求求你们了,不要再来爬取了,受不了了!!

    话说 在很久很久以前 小明不小心发现了一个叫做 学习python的正确姿势 从此一发不可收拾 看到什么网站都想爬取 有一天 小明发现了一个小黄网 里面的小姐姐 一个比一个诱人 看了一会这个小黄网 小明 ...

  9. 2018/01/22 爬虫日记

    20171024 ①导入自定义的模块(如类),需要在当前类作导入 类的引用声明,如self.tool = tool.Tool() 20171025 ①正则表达式:两个<><>之 ...

最新文章

  1. ubuntu编译内核重启出现:gave up waiting for root device
  2. springboot集成spring security安全框架入门篇
  3. OC仿支付宝输入UITextField输入车牌号
  4. QPainter函数setClipRect
  5. “.Net 社区虚拟大会”(dotnetConf) 2016 Day 2 Keynote: Miguel de Icaza
  6. java地址传递_关于java中是地址传递还是值传递的测试
  7. NG Ng-content(内容映射)
  8. 编译加速 remote cache
  9. Mysql导出数据 (windows Linux)
  10. 深度学习:batch_size和学习率 及如何调整
  11. 计蒜客 25985.Goldbach-米勒拉宾素数判定(大素数) (2018 ACM-ICPC 中国大学生程序设计竞赛线上赛 B)...
  12. latex减少图片和图片解释文字之间的距离
  13. Atitit.rsa密钥生成器的attilax总结
  14. 2021-09-02Hive
  15. java 点云数据处理_概述 | 点云数据处理方法都有哪些?
  16. 几何基础,多种矩阵的学习,世界坐标到屏幕坐标的两种转换方法,三种绘制方框的原理,hookd3d,hookopengl,骨骼透视,主播的秘密,FPS各种BT功能的原理 和检测对抗原理,UE4引擎,U3D
  17. ip模拟工具modify headers
  18. 质检动真格,你的本科毕业论文该怎么做?
  19. Win11 系统安装事项,跳过微软账户登录,VMWare安装Win11
  20. 逃离北上广的“症结”

热门文章

  1. 详解上海交大819考研
  2. 镶嵌数据集使用--ArcGIS Pro
  3. uniapp使用地图
  4. Meth | phpstorm invalid descendent file name
  5. 冷知识:以前飞机上不能玩手机是因为山寨机太多?
  6. Nintendo帐户,用户ID和网络ID:Nintendo所有令人困惑的帐户,说明
  7. nyoj144 小珂的苦恼
  8. java日期和时间操作
  9. 微信小程序 - 云开发data exceed max size 解决方案
  10. 什么是I/O寄存器的边际效应