豆瓣的反爬虫

1. 电影短评爬取

经过探索可以发现,电影短评页面的url具有规律,只需要知道电影的id就可以批量生成,且不需要进行豆瓣登录就可以查看。但豆瓣具有封ip机制,爬取的时候要尽量小心。

首先在settings中添加download_delay防止过快的爬取,添加randomize_donwload_delay随机化爬取延迟。

使用Faker()随机生成ua。此时存在一个问题,Faker生成的随机ua也包含移动端,html与pc端大相径庭,且会缺少部分数据,难以进行爬取。

通过搜集资料,我手动修改了lib中chrome()的源代码,添加了一个is_pc参数来确保生成的ua都是pc端的。

对于每条电影短评,需要爬取短评的文本内容和对应的用户主页的url,从而合成用户“广播”页面的url。

这里使用xpath进行数据抽取。可以观察到,电影名“肖申克的救赎”就在id为“content”的div节点中;每一个短评都在class为comment-item的节点中,xpath选取所有短评;分析短评的源代码可以发现,用户主页的url存在“comment-info”的a节点中,评论存在class为“short”的span节点中。

2. 用户“广播”数据爬取

获取短评用户的主页url后,我们可以增加"“/statuses”后缀,得到其“广播”的url,但未登录的情况下进入该页面会显示需要登录。

由于需要爬取的数据量不大,我选择手动登录后导出cookie,给爬虫使用。这里使用cookie-editor插件自动获取cookie,使用header string格式导出。

此时如果用随机ua爬取可能会被封号,因此我完整复制了本地浏览器ua的其他参数,构成了该爬虫使用的ua。

 

在settings中设置cookies_enabled为false,即可在request中使用该hearders。

在用户广播页面,由于我需要爬取到用户喜爱的电影,因此筛选出标签为“看过”且用户对其的评分在四分及以上的电影,并爬取电影的名称,例如这个“少年派的奇幻漂流”。

观察每条“广播”的源代码可以发现,它存在“new-status stutus-wrapper”的div节点中,使用xpath对上述提到的条件进行筛选和爬取:titles = response.xpath("//div[contains(@class, 'new-status status-wrapper') and .//div[contains(@class, 'text') and contains(., '看过')] and .//span[contains(@class, 'rating-stars') and (contains(text(), '★★★★☆') or contains(text(), '★★★★★'))]]//div[@class='title']/a/text()")

好的,我可以帮您回答这个问题。首先,我需要说明一下,爬取网站数据需要遵守相关法律法规和网站的使用条款,不得进行非法爬取。在进行数据爬取时,我们需要设置适当的访问间隔,避免对网站造成过大的负担。同时,也需要设置合适的请求头,模拟人类访问,以避免被网站识别为爬虫程序。 对于豆瓣电影Top250的数据爬取,我们可以使用R语言中的rvest包进行网页解析和爬取。具体步骤如下: 1. 首先,我们需要使用R语言中的rvest包以及httr包,使用GET函数获取豆瓣电影Top250的网页源代码。 ```R library(rvest) library(httr) url <- "https://movie.douban.com/top250" res <- GET(url) html <- content(res, "text") ``` 2. 接着,我们需要使用rvest包中的html_nodes函数和html_text函数,对网页源代码进行解析,获取我们需要的电影信息。例如,我们可以获取电影名称、电影评分、电影链接等信息。 ```R doc <- html_text(html, encoding = "UTF-8") html_doc <- html(html, encoding = "UTF-8") movie_names <- html_text(html_nodes(html_doc, ".title:nth-child(1) a")) movie_links <- html_attr(html_nodes(html_doc, ".title:nth-child(1) a"), "href") movie_ratings <- html_text(html_nodes(html_doc, ".rating_num")) ``` 3. 获取电影信息后,我们可以将其保存为数据集,方便后续的数据处理和分析。 ```R movie_data <- data.frame(name = movie_names, link = movie_links, rating = movie_ratings) write.csv(movie_data, "movie.csv", row.names = FALSE) ``` 4. 对于数据集的数据清洗和预处理,我们可以使用R语言中的dplyr包、tidyr包等进行数据清洗和处理。例如,我们可以去除缺失值、重复值、异常值等。 ```R library(dplyr) library(tidyr) movie_data <- read.csv("movie.csv", stringsAsFactors = FALSE) movie_data %>% filter(!is.na(name) & !is.na(link) & !is.na(rating)) %>% distinct() %>% filter(rating >= 0 & rating <= 10) %>% separate(name, into = c("chinese_name", "foreign_name"), sep = "/") %>% separate(foreign_name, into = c("english_name", "year"), sep = "\\(") %>% mutate(year = gsub("\\)", "", year), chinese_name = trimws(chinese_name), english_name = trimws(english_name), rating = as.numeric(rating)) ``` 5. 最后,我们可以使用R语言中的ggplot2包进行数据可视化分析,例如,我们可以绘制电影评分的直方图和散点图等。 ```R library(ggplot2) ggplot(movie_data, aes(x = rating)) + geom_histogram(binwidth = 0.5, fill = "lightblue", color = "black") + ggtitle("Distribution of Movie Ratings") + xlab("Rating") + ylab("Count") ggplot(movie_data, aes(x = rating, y = year)) + geom_point(size = 1) + ggtitle("Movie Ratings vs. Release Year") + xlab("Rating") + ylab("Release Year") ``` 以上就是使用R语言爬取豆瓣电影Top250数据,并对数据进行清洗、预处理、可视化分析的步骤。需要注意的是,爬取网站数据需要遵守相关法律法规和网站的使用条款,不得进行非法爬取。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值