python爬取豆瓣正在上映的电影

爬取的目标网址:

https://movie.douban.com/cinema/nowplaying/zhuhai/

(后面这个珠海是表示的地点)

使用的工具:

Jupyter Notebook(5.4.7),python3.7.1

使用的python库:

requests、pyquery、pandas

要爬取的网站长这个样子:
python爬取豆瓣正在上映的电影_第1张图片
先引入库

import requests
from pyquery import PyQuery as pq
import pandas as pd

使用requests库和get函数对网站进行解析,其中的headers是请求头,使得我们的请求更像人为的,不会被浏览器直接判定为程序而不让你访问。

url = "https://movie.douban.com/cinema/nowplaying/zhuhai/"
headers = {
    "User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36",
    "referer" : "https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-4830389020085397&output=html&h=250&slotname=1983604743&adk=4099574729&adf=1507960139&w=300&guci=2.2.0.0.2.2.0.0&format=300x250&url=https%3A%2F%2Fmovie.douban.com%2Fcinema%2Fnowplaying%2Fzhuhai%2F&ea=0&flash=0&avail_w=300&wgl=1&dt=1557842686775&bpp=26&bdt=22&fdt=28&idt=14&shv=r20190508&cbv=r20190131&saldr=aa&correlator=222006145910&frm=23&ife=1&pv=2&ga_vid=1867373037.1557842687&ga_sid=1557842687&ga_hid=1079905800&ga_fc=0&iag=3&icsg=680&nhd=1&dssz=6&mdo=0&mso=0&u_tz=480&u_his=4&u_java=0&u_h=864&u_w=1536&u_ah=824&u_aw=1536&u_cd=24&u_nplug=3&u_nmime=4&adx=700&ady=183&biw=965&bih=738&isw=300&ish=250&ifk=208477544&scr_x=0&scr_y=0&eid=20040081%2C21060853&oid=3&ref=https%3A%2F%2Fmovie.douban.com%2F&rx=0&eae=2&fc=656&brdim=0%2C0%2C0%2C0%2C1536%2C0%2C1536%2C824%2C300%2C250&vis=1&rsz=%7C%7CoeE%7C&abl=CS&pfx=0&fu=1044&bc=31&osw_key=1268507751&ifi=1&uci=1.sx7tlffxm1po&fsb=1&dtd=46"
}
response = requests.get(url, headers = headers)

寻找一下,我们需要提取的信息是在哪里?可以看到,需要提取的信息在div节点下的ul节点中,ul节点中的每一个li节点表示一部电影,这里只截取了一部,其他也可以自己取网站上看看。
python爬取豆瓣正在上映的电影_第2张图片
使用pyquery的PyQuery将请求到的网页代码解析成可提取的格式,然后提取id为nowplaying,class为lists的所有节点,使用items将其构建成一个可循环的对象,进行循环。

我们要提取的电影名称、评分、时长、地区、导演、演员都是li节点下面的属性,所以用attr可以直接提取,并汇总成一个列表加入构建的结果列表中。

doc = pq(response.text)
doc1 = doc("#nowplaying .lists")
douban_nowplaying = []
for i in doc1.children("li").items():
    name = i.attr("data-title")
    score = i.attr("data-score")
    time = i.attr("data-duration")
    region = i.attr("data-region")
    director = i.attr("data-director")
    actor = i.attr("data-actors")
    
    douban_nowplaying.append([name, score, time, region, director, actor])

res = pd.DataFrame(douban_nowplaying, columns = ["电影名称", "评分", "时长", "地区", "导演", "演员"])
res["评分"] = res["评分"].replace("0", "暂无评分")

循环完成以后,使用pandas的DataFrame将其构建一个DataFrame数据类型,其实可以用很多种保存方式,这里是知道没有缺失的数据,量也不大,所以使用了DataFrame,主要是我觉得DataFrame在Jupyter Notebook中的展现形式比较好看。

最后,我们拿到的数据中,评分那一栏有0分的,而网页显示的是暂无评分,所以使用replace将0分的数据替代为“暂无评分”。总共是爬取到了26部电影的信息,和网页展现的也一样,部分的截图如下:
python爬取豆瓣正在上映的电影_第3张图片
爬取到这里就结束了,才刚刚开始学习爬虫,请各位大佬指教。

你可能感兴趣的:(爬虫)