Поисковый робот urllib и чтение декомпрессии

Python

Это второй день моего участия в ноябрьском испытании обновлений, подробности о мероприятии:Вызов последнего обновления 2021 г.

Библиотека Python urllib используется для управления URL-адресами веб-страниц и сканирования содержимого веб-страниц.

заголовок запроса

headers = {
    'User-Agent': 'Mozilla/5.0 (iPad; CPU OS 11_0 like Mac OS X) AppleWebKit/604.1.34 (KHTML, like Gecko) Version/11.0 Mobile/15A5341f Safari/604.1',
    'Referer': 'https://*******'
}

Заголовок запроса может быть замаскирован под реальную машину, делая вид, что она работает и просматривает, и его нелегко обнаружить. User-Agent, Referer и Cookie можно проверить, щелкнув правой кнопкой мыши веб-страницу и найти в запросе NetWork.

Это антикраулинговый метод.Конечно, вы также можете собрать кучу User-Agent или сгенерировать User-Agent случайным образом и т. д. Вы также можете заснуть после сканирования нескольких страниц.Я обычно сплю в течение 2 секунд.

Ползание

Подробно путь писать не буду,можно подставить свой.Сейчас мне нужно просканировать данные фильма для простого анализа,и я выбрал 3 категории

DICT = {"喜剧": "https://s/1---喜剧--------.html",
        "爱情": "https://s/1---爱情--------.html",
        "动作": "https://s/1---动作--------.html"}

Сохраните просканированные данные в data.csv, который имеет шесть полей: название фильма, рейтинг фильма, категория фильма, режиссер фильма, регион и год.

f = open("data.csv", "w", encoding='utf-8', newline='')
writer = csv.writer(f)
writer.writerow(['movie_title', 'movie_score', 'movie_type', 'movie_director', 'movie_region', 'movie_year'])

Закройте его, когда закончитеf.close()

Сначала вставьте полный код:

for kind in DICT:
    url = DICT[kind]
    url = quote(url, safe=string.printable)
    request = Request(url, headers=headers)
    res = urlopen(request)
    with open("./tempFile/" + kind + ".html", 'wb') as f:
        f.write(res.read())
    with open("./tempFile/" + kind + ".html", 'r', encoding='utf-8') as f:
        data = f.read()
    soup = BeautifulSoup(data, "html.parser")
    node_list = soup.find("ul", class_="myui-vodlist").findAll("li")
    for li in node_list:
        movie_detailUrl = "https://s/" + li.find("h4", class_="title").find("a")['href']
        movie_title = li.find("h4", class_="title").find("a").get_text()
        movie_score = li.find("span", class_="pic-tag").get_text()
        movie_director, movie_region, movie_year = get_movieInfo(movie_detailUrl)
        writer.writerow([movie_title, movie_score, kind, movie_director, movie_region, movie_year])
        print(movie_title, movie_detailUrl, kind, movie_director, movie_region, movie_year)
        # time.sleep(2)
f.close()

url = quote(url, safe=string.printable)Это означает, что если в пути решения есть китайский язык, он поможет вам его преобразовать;"./tempFile/" + kind + ".html"Безопаснее будет хранить его по этому пути и потом читать, но это, конечно, не обязательно;

soup = BeautifulSoup(data, "html.parser")Использование BeautifulSoup будет более удобным и понятным, у меня немного кружится голова от метода поиска пути, такого как scrapy.soup.find("ul", class_="myui-vodlist").findAll("li") Например, чтобы найти все элементы li в ul с помощью класса myui-vodlistfind("a").get_text() Это чтобы вынуть текст в

распаковать читать

В функции get_movieInfo получить нужный нам контент на другой странице, на этой странице тоже так же получить, но мою страницу нужно распаковать, чтобы прочитать.Для новичков тоже первый раз столкнулся ? Итак, теперь у нас есть еще один шаг, после получения запроса используйте поток ввода-вывода для чтения, а затем распаковывайте

res = urlopen(request)
htmls = res.read()
buff = BytesIO(htmls)
ff = gzip.GzipFile(fileobj=buff)
htmls = ff.read()

Попади в точку! Мы собираемся добавить это в заголовок запроса"Accept-Encoding": "gzip", серый очень важен, насколько он важен, то есть если его не напишешь, то получишь ошибку?

Эта остановка данных вызывает у меня головную боль

QQ图片20211103202351.png

QQ图片20211103202819.pngПервоначально я взял последние два A A.GET_TEXT (), но если бы год неизвестен, последний а может быть регион Решение состоит в том, чтобы взять все слова в нем (содержание без элементов) для сегментации, я слишком глупо ?

aaa = soup.find("p", class_="data").text
list = str(aaa).replace('\xa0', ' ').split(" ")
index = -1
li = []
for i in list:
    if i != '':
       li.append(i)
movie_year = li[index].split(':')[1]

Просто сохраните полученные данные в csv ?

 writer.writerow([movie_title, movie_score, kind, movie_director, movie_region, movie_year])