支线任务-Python爬虫

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

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

书写目的:

  • 数据数量和质量对你运行模型的效果有着重要影响;
  • 如果数据购买昂贵又没有现成数据下载,不论个人还是公司都会首选爬虫;
  • 不需要深入爬虫知识(比如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).text

pattern1 = re.compile("https://movie.douban.com/review/\d+/")
review_url_list = pattern1.findall(total1)
review_url_list = list(set(review_url_list))#remove duplicates

import pandas as pd
review = []

for url in review_url_list:
    total = requests.get(url).text
    pattern2 = 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 BeautifulSoup

import 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" % imageName
                urllib.request.urlretrieve(link,filesavepath)

getAllImageLink()               

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

大boss之一

import requests
import re
from bs4 import BeautifulSoup
import collections

headers = {
    '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 soup

soup = 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 webdriver

url = '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 =False
    while 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]').text
            review[(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]').text
            success = True
        except:
            success=True
            pass 

DF1 = pd.DataFrame({"time": time, "reviews": review})
DF1.head()#由于追加评论导致格式不一致,后期数据清洗也很重要

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

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

Conclusion

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

Reference

原文地址:https://www.cnblogs.com/ChristopherLE/p/10798579.html

时间: 2024-10-12 07:48:53

支线任务-Python爬虫的相关文章

开始我的Python爬虫学习之路

因为工作需要经常收集一些数据,我就想通过学爬虫来实现自动化完成比较重复的任务. 目前我Python的状况,跟着敲了几个教程,也算是懂点基础,具体比较深入的知识,是打算从做项目中慢慢去了解学习. 我是觉得如果一开始就钻细节的话,是很容易受到打击而放弃的,做点小项目让自己获得点成就感路才更容易更有信心走下去. 反正遇到不懂的就多查多问就对了. 知乎上看了很多关于入门Python爬虫的问答,给自己总结出了大概的学习方向. 基础: HTML&CSS,JOSN,HTTP协议(这些要了解,不太需要精通) R

Python爬虫实战(2):爬取京东商品列表

1,引言 在上一篇<Python爬虫实战:爬取Drupal论坛帖子列表>,爬取了一个用Drupal做的论坛,是静态页面,抓取比较容易,即使直接解析html源文件都可以抓取到需要的内容.相反,JavaScript实现的动态网页内容,无法从html源代码抓取需要的内容,必须先执行JavaScript. 我们在<Python爬虫使用Selenium+PhantomJS抓取Ajax和动态HTML内容>一文已经成功检验了动态网页内容的抓取方法,本文将实验程序进行改写,使用开源Python爬虫

转载:用python爬虫抓站的一些技巧总结

原文链接:http://www.pythonclub.org/python-network-application/observer-spider 原文的名称虽然用了<用python爬虫抓站的一些技巧总结>但是,这些技巧不仅仅只有使用python的开发可以借鉴,我看到这篇文章的时候也在回忆自己做爬虫的过程中也用了这些方法,只是当时没有系统的总结而已,谨以此文为鉴,为以前的爬虫程序做一个总结. 转载原文如下: 学用python也有3个多月了,用得最多的还是各类爬虫脚本:写过抓代理本机验证的脚本,

python爬虫Urllib实战

Urllib基础 urllib.request.urlretrieve(url,filenname) 直接将网页下载到本地 import urllib.request >>> urllib.request.urlretrieve("http://www.hellobi.com",filename="D:\/1.html") ('D:\\/1.html', <http.client.HTTPMessage object at 0x0000000

python 爬虫抓取心得

quanwei9958 转自 python 爬虫抓取心得分享 urllib.quote('要编码的字符串') 如果你要在url请求里面放入中文,对相应的中文进行编码的话,可以用: urllib.quote('要编码的字符串') query = urllib.quote(singername) url = 'http://music.baidu.com/search?key='+query response = urllib.urlopen(url) text = response.read()

[Python爬虫] Selenium爬取新浪微博客户端用户信息、热点话题及评论 (上)

一. 文章介绍 前一篇文章"[python爬虫] Selenium爬取新浪微博内容及用户信息"简单讲述了如何爬取新浪微博手机端用户信息和微博信息. 用户信息:包括用户ID.用户名.微博数.粉丝数.关注数等. 微博信息:包括转发或原创.点赞数.转发数.评论数.发布时间.微博内容等. 它主要通过从文本txt中读取用户id,通过"URL+用户ID" 访问个人网站,如柳岩: http://weibo.cn/guangxianliuya 因为手机端数据相对精简简单,所以采用输

大量 python 爬虫源码分享--说说 python 爬虫这件小事

没有爬虫就没有互联网,越来越觉得写 Python 爬虫原来是一件快乐而高兴的事情,以下是本人收集整理的一批 python 爬虫代码,顺便分享到了别的网站上,喜欢的下下来看看吧. 内容: yunpan.360.cn.py 360 网盘爬虫 ed2k_search.py 电驴爬虫 music.163.com.py 163 音乐爬虫 music.baidu.com.py 百度音乐爬虫 pan.baidu.com.py 百度网盘爬虫 115.py 115 爬虫 91porn.py 91porn 爬虫 等

[Python爬虫] Selenium实现自动登录163邮箱和Locating Elements介绍

目录(?)[+] 前三篇文章介绍了安装过程和通过Selenium实现访问Firefox浏览器并自动搜索"Eastmount"关键字及截图的功能.而这篇文章主要简单介绍如何实现自动登录163邮箱,同时继续介绍Selenium+Python官网Locating Elements部分内容.        希望该篇基础性文章对你有所帮助,如果有错误或不足之处,请海涵~        [Python爬虫] 在Windows下安装PhantomJS和CasperJS及入门介绍(上)        

Python 爬虫批量下载美剧 from 人人影视 HR-HDTV

本人比較喜欢看美剧.尤其喜欢人人影视上HR-HDTV 的 1024 分辨率的高清双字美剧,这里写了一个脚本来批量获得指定美剧的全部 HR-HDTV 的 ed2k下载链接.并依照先后顺序写入到文本文件,供下载工具进行批量下载.比方用迅雷.先打开迅雷,然后复制全部下载链接到剪切板,迅雷会监视剪切板来新建全部任务.假设迅雷没有自己主动监视,能够自己点击新建然后粘贴链接.Python源码例如以下.用的是Python3 : # python3 实现,以下的实例 3 部美剧爬完大概要 10 s import