五一小长假要到了,甄开心,肯定比写博客要开心多了,哈哈哈哈

我还在犹豫要不要写爬虫这篇,因为网上已经有大量爬虫相关资源,爬虫也不是以研究为主,而是一个获取数据的手段。

书写目的:

  • 数据数量和质量对你运行模型的效果有着重要影响;
  • 如果数据购买昂贵又没有现成数据下载,不论个人还是公司都会首选爬虫;
  • 不需要深入爬虫知识(比如Scrapy爬虫工程),就可以获取大部分网站数据;

装包提示:

  • 装包用pip install XXX,Baidu一下有很多指导帖
  • 学会Baidu谷歌能够让你在之后的路上走得更远更自信

豆瓣影评

Use Requests and regular expression

正则表达式-重要的事情说两遍

  • [c,m,f]an: can, man, fan; [^b]og to skip bog
  • [^a-z]\w+ skip lower case begined string; \w means [A-Za-z0-9]; \d means [0-9]
  • z{3} match z three times: uzzz, wuzzzz; .{2,6} match string with length of 2-6
  • ? match ?
  • whitespace: space (␣), the tab (\t), the new line (\n) and the carriage return (\r)
  • \s will match any of the specific whitespaces above
  • \D represents any non-digit character, \S any non-whitespace character, and \W any non-alphanumeric
  • ^Mission: successful$ ^为字符串开始 and $为字符串结尾
  • ^(file_\w+) can match file_record_transcript in file_record_transcript.pdf
  • ^([A-Z]\w{2} (\d{4})) 括号中为提取的信息,此处不但提取Jan 1987,还提取1987
  • ^I love cats|I love dogs$ match "I love cats"或"I love dogs"
  • ^The.* match string starting with "The"

正则表达式的练习在线网址: https://regexone.com/

二话不说上代码,晕~

import re
import requests
import matplotlib.pyplot as plt
url = "https://movie.douban.com/review/best/"
total1 = requests.get(url).textpattern1 = re.compile("https://movie.douban.com/review/\d+/")
review_url_list = pattern1.findall(total1)
review_url_list = list(set(review_url_list))#remove duplicatesimport pandas as pd
review = []for url in review_url_list:total = requests.get(url).textpattern2 = re.compile("<p>.*</p>")review0 = str(pattern2.findall(total))review.append(review0) DF1 = pd.DataFrame({"影评": review, "网址": review_url_list})
DF1#可以看到影评中还有许多源码需要去除

获取图片地址

import re
import requests
import matplotlib.pyplot as plt
url = "https://movie.douban.com/"
total = requests.get(url).text
pattern1 = re.compile("https://movie.douban.com/subject/\d+/\?from=showing")
pattern2 = re.compile("https://img3.doubanio.com/view/photo/s_ratio_poster/public/p\d+.jpg")
pattern2.findall(total)[:5]

有了图片地址,就意味着我们可以得到图片了

同时获取图片及命名

Use BeautifulSoup

import urllib.request
import urllib
import os
from bs4 import BeautifulSoupimport string
table=str.maketrans({key:None for key in string.punctuation})#防止文件命名中出现标点符号,移除 ? / , .def getAllImageLink():for i in range(0,2):#可以设为100页或更高if i==0:url="http://www.dbmeinv.com"else:url="https://www.dbmeinv.com/?pager_offset="+str(i+1)#自己寻找翻页后网址变化规律html = urllib.request .urlopen(url).read()soup = BeautifulSoup(html)liResult = soup.findAll('li',attrs={"class":"span3"})for li in liResult:imageEntityArray = li.findAll('img')for image in imageEntityArray:link = image.get('src')imageName = image.get('title')imageName=imageName.translate(table)filesavepath = "%s.png" % imageNameurllib.request.urlretrieve(link,filesavepath)getAllImageLink()               

伪装Header,爬取百度百科中北京地铁站

大boss之一

import requests
import re
from bs4 import BeautifulSoup
import collectionsheaders = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.84 Safari/537.36'
}def craw(url):response = requests.get(url, headers=headers)soup = BeautifulSoup(response.content, 'html.parser')return soupsoup = craw('https://baike.baidu.com/item/%E5%8C%97%E4%BA%AC%E5%9C%B0%E9%93%81/408485')
lines = soup.findAll('table')[4].findAll('a')[:-1]stations_connection = collections.defaultdict(list)
dist = collections.defaultdict(int)
node_in_line = collections.defaultdict(set)pattern = re.compile('([\w|\d]+)相邻站间距信息统计表')for line in lines[:-3]:link = 'https://baike.baidu.com' + line.get('href')soup = craw(link)for caption in soup.find_all('caption'):line_name = re.findall(pattern, caption.get_text())if line_name:print('\n----The information of {} is following...'.format(line_name[0]))table = caption.find_parent('table')for neigbor in table.find_all('tr')[1:]:start, end = re.findall(re.compile('([\w|\d]+)——([\w|\d]+)'), neigbor.th.text)[0]distance = re.findall(re.compile('([\d]+)米*'), neigbor.td.text)[0]stations_connection[start].append(end)stations_connection[end].append(start)dist[(start,end)] = dist[(end,start)] = int(distance)node_in_line[start].add(line_name[0])node_in_line[end].add(line_name[0])print('{}--{}: {}m'.format(start, end, distance))break

有了这些数据,意味着你可以作出个北京地铁路线图(如图1所示)

也意味着你可以做个北京地铁换乘的simple APP,示意如图2所示。

手动+自动的Selenium 本章终极boss “Website Nightmare”

既然可以手动,那就代表:

  • 你可以手动关闭弹窗
  • 手动输入账号密码跨过大部分网站门槛
  • 手动输入验证码跨过进入壁垒
  • 还一个优势就是可视化你的爬取过程
  • 虽然速度无法与Scrapy媲美,但操作性+适用性还是挺有优势的

selenium入门教学请点击Christopher's Github

Example: 爬取兰蔻天猫旗舰店的消费者评论

import re
import requests
import time
from bs4 import BeautifulSoup
from selenium import webdriverurl = 'https://detail.tmall.com/item.htm?spm=a1z10.3-b-s.w4011-14640892229.94.3c6f3c22ejqhZA&id=556028888955&rn=f74615e5cda8e547b07f67e1eb384119&abbucket=16&on_comment=1'
#这里更换目标产品评论网页(天猫兰蔻旗舰店)
driver1 = webdriver.Chrome()#谷歌自动打开之后请手动登陆
driver1.get(url) # 打开网页import pandas as pd
time=[0]*100
review=[0]*100#前四页的“下一页”Xpath不一样;所以先“手动”爬前四页
j=1#爬完一页,手动点击下一页,再j变2,变3,变4;这对于没规律的网站是很难爬,爬取大批量数据建议找有规律的网站,通过循环爬取
for i in range(1,21):success =Falsewhile not success:try:time[(j-1)*20+i-1]=driver1.find_element_by_xpath('//*[@id="J_Reviews"]/div/div[6]/table/tbody/tr['+str(i)+']/td[1]/div[2]').textreview[(j-1)*20+i-1]=driver1.find_element_by_xpath('//*[@id="J_Reviews"]/div/div[6]/table/tbody/tr['+str(i)+']/td[1]/div[1]/div[1]').textsuccess = Trueexcept:success=Truepass DF1 = pd.DataFrame({"time": time, "reviews": review})
DF1.head()#由于追加评论导致格式不一致,后期数据清洗也很重要

有了消费者评论数据,你可以做

  • 评论情感打分
  • 产品属性提及率及好评率交叉分析
  • 竞品Attributes比较分析
  • Digital Marketing Strategy及市场营销策略

Conclusion

  • 爬虫不是我们的终点与重点
  • 爬虫只是我们获取数据的一种方法
  • 运用爬虫的同时请注意法律法规
  • 通过分析数据得到我们的Insights才是重点

Reference

转载于:https://www.cnblogs.com/ChristopherLE/p/10798579.html

支线任务-Python爬虫相关推荐

  1. 关于Python爬虫原理和数据抓取1.1

    为什么要做爬虫? 首先请问:都说现在是"大数据时代",那数据从何而来? 企业产生的用户数据:百度指数.阿里指数.TBI腾讯浏览指数.新浪微博指数 数据平台购买数据:数据堂.国云数据 ...

  2. python爬虫之Scrapy框架的post请求和核心组件的工作 流程

    python爬虫之Scrapy框架的post请求和核心组件的工作 流程 一 Scrapy的post请求的实现 在爬虫文件中的爬虫类继承了Spider父类中的start_urls,该方法就可以对star ...

  3. python爬虫抓取信息_python爬虫爬取网上药品信息并且存入数据库

    我最近在学习python爬虫,然后正好碰上数据库课设,我就选了一个连锁药店的,所以就把网上的药品信息爬取了下来. 1,首先分析网页 2,我想要的是评论数比较多的,毕竟好东西大概是买的人多才好.然后你会 ...

  4. python爬虫案例_推荐上百个github上Python爬虫案例

    现在学生都对爬虫感兴趣,这里发现一些好的github开源的代码,分享给各位 1.awesome-spider 该网站提供了近上百个爬虫案例代码,这是ID为facert的一个知乎工程师开源的,star6 ...

  5. Python培训分享:python爬虫可以用来做什么?

    爬虫又被称为网络蜘蛛,它可以抓取我们页面的一些相关数据,近几年Python技术的到来,让我们对爬虫有了一个新的认知,那就是Python爬虫,下面我们就来看看python爬虫可以用来做什么? Pytho ...

  6. 玩转 Python 爬虫,需要先知道这些

    作者 | 叶庭云 来源 | 修炼Python 头图 | 下载于视觉中国 爬虫基本原理 1. URI 和 URL URI 的全称为 Uniform Resource Identifier,即统一资源标志 ...

  7. 买不到口罩怎么办?Python爬虫帮你时刻盯着自动下单!| 原力计划

    作者 | 菜园子哇 编辑 | 唐小引 来源 | CSDN 博客 马上上班了,回来的路上,上班地铁上都是非常急需口罩的. 目前也非常难买到正品.发货快的口罩,许多药店都售完了. 并且,淘宝上一些新店口罩 ...

  8. 一个月入门Python爬虫,轻松爬取大规模数据

    如果你仔细观察,就不难发现,懂爬虫.学习爬虫的人越来越多,一方面,互联网可以获取的数据越来越多,另一方面,像 Python这样一个月入门Python爬虫,轻松爬的编程语言提供越来越多的优秀工具,让爬虫 ...

  9. Python爬虫获取文章的标题及你的博客的阅读量,评论量。所有数据写入本地记事本。最后输出你的总阅读量!

    Python爬虫获取文章的标题及你的博客的阅读量,评论量.所有数据写入本地记事本.最后输出你的总阅读量!还可以进行筛选输出!比如阅读量大于1000,之类的! 完整代码在最后.依据阅读数量进行降序输出! ...

最新文章

  1. WordPress设计bug+WooCommerce漏洞导致网站存在被劫持风险
  2. 一场由nginx优化引起的tcp/ip及tcpdump研究
  3. golang日期时间格式format()
  4. Java面试常见算法
  5. line-height:1.5和line-height:150%的区别
  6. timeshift备份你的Linux系统
  7. COJ 1700:联通与次联通
  8. Apache vs Lighttpd vs Nginx对比
  9. mysql是bsd协议吗_freebsd下实现mysql的自动备份
  10. davlik虚拟机内存管理之一——内存分配
  11. CAD转换图片的小窍门
  12. 彻底剖析C# 2.0泛型类的创建和使用
  13. C++ 在dynamic_castlt;gt;用法
  14. 一步步教你搭建自己的云服务器,(鉴于网上一大堆文章,看这一篇就够了)
  15. openWRT的DTS文件配置--MT7620A
  16. ICPC2021第一场网络预选赛A题
  17. 高通平台开发系列讲解(充电篇)充电管理芯片PM7250B详解
  18. 浴室预约微信小程序的设计与实现
  19. LeetCode 344.Reverse String
  20. Algorithm之PrA:PrA之LP线性规划算法经典案例剖析+Matlab编程实现

热门文章

  1. 【5G RAN】5G gNB间的N2/NGAP切换(handover)那点事儿
  2. 跑在树莓派上智能家居雏形(一)
  3. c语言买100个苹果,c语言错误: 阳阳买苹果,每个苹果0.8元,第一天他买2个,第二天开始每天买前一天的2倍,直到购买的苹果...
  4. html+css 实现华为登录界面
  5. 增大max_result_window是错的,ES只能查询前10000条数据的正确解决方案
  6. EXCEL从字符串中截取数字(规格中取直径、长、宽、高)
  7. java replace( . )_Java replace() 方法
  8. 前端性能优化之资源传输优化、渲染优化、Web 加载和渲染原理
  9. Single Image Portrait Relighting via Explicit Multiple Reflectance Channel Modeling 论文笔记
  10. 由全面战争与像素海盗想到的